首页 > 其他分享 >在winform中如何实现双向数据绑定?

在winform中如何实现双向数据绑定?

时间:2024-03-18 17:26:07浏览次数:440  
标签:people 绑定 List BindingList dataGridView1 双向 Home winform

什么是双向数据绑定?

双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着当模型数据发生变化时,UI会自动更新,反之亦然。这种双向数据绑定极大地简化了UI和模型数据之间的同步,使开发者可以更专注于业务逻辑,而不是手动处理UI和数据的同步。

今天我想通过winform中DataGridView控件为例,介绍在winform中如何实现双向数据绑定。

一般在winform中使用DataGridView控件时,我们可能是这样使用的:

创建数据源

以Person类为例:

  public class Person
  {
      public string? Name { get; set; }
      public string? Home { get; set; }
  }

创建Person对象列表:

  // 创建一个Person对象的列表
  List<Person> people = new List<Person>()
  {
      new Person {Name = "张三",Home = "武汉" },
      new Person {Name = "李四",Home = "南昌" },
      new Person {Name = "王五",Home = "福州" },
  };

绑定数据源:

dataGridView1.DataSource = people;

这个时候的效果如下所示:

image-20240318122622743

当我们进行修改之后,如下所示:

image-20240318122756582

现在打印people列表第一个和第二个person对象的Home属性值看看:

  Debug.WriteLine(people[0].Home);
  Debug.WriteLine(people[1].Home);

结果如下图所示:

image-20240318122906132

说明在dataGridView1上修改数据,people列表也被修改了。

现在反过来测试一下,修改people列表第一个和第二个person对象的Home属性值:

 people[0].Home = "厦门";
 people[1].Home = "厦门";

会发现dataGridView1上的数据不会发生变化,需要我们点击对应的空格之后才会发生改变,如下所示:

显示值的改变

如果我们这样写的话:

 people[0].Home = "厦门";
 people[1].Home = "厦门";
 dataGridView1.UpdateCellValue(1,1);
 dataGridView1.UpdateCellValue(1,2);

效果如下所示:

显示值的改变2

只改变了一个空格的值,另一个还是需要点击一下,才更新。

在winform中实现双向数据绑定示例

首先创建一个Student类,如下所示:

 public class Student : INotifyPropertyChanged
 {
    
     private string? _name;

     public string Name
     {
         get { return _name; }
         set
         {
             _name = value;
             // Call OnPropertyChanged whenever the property is updated
             OnPropertyChanged("Name");
         }
     }       
     private string? _home;

     public string Home
     {
         get { return _home; }
         set
         {
             _home = value;
             // Call OnPropertyChanged whenever the property is updated
             OnPropertyChanged("Home");
         }
     }

     // Declare the event
     public event PropertyChangedEventHandler? PropertyChanged;
     // Create the OnPropertyChanged method to raise the event
     protected void OnPropertyChanged(string name)
     {
         var handler = PropertyChanged;
         handler?.Invoke(this, new PropertyChangedEventArgs(name));
     }
 }

实现了INotifyPropertyChanged接口。

创建数据源:

 // 创建一个Student对象的列表
 BindingList<Student> students = new BindingList<Student>()
 {
         new Student { Name = "张三", Home = "武汉" },
         new Student { Name = "李四", Home = "南昌"  },
         new Student { Name = "王五", Home = "福州"  },
 };

注意这里使用的是BindingList<T>而不是List<T>

image-20240318125228934

BindingList<T>List<T>的区别

BindingList 和 List 都是用于存储对象的集合,但它们之间有一些关键的区别。

  1. 数据绑定支持:BindingList 是为数据绑定设计的,它实现了 IBindingList 接口。这意味着当 BindingList 中的数据发生更改时(例如,添加、删除或修改项),它会自动通知绑定到它的任何 UI 控件。这对于 Windows Forms 或 WPF 这样的 UI 框架非常有用,因为它们可以自动更新以反映数据的更改。相比之下,List 不支持数据绑定。
  2. 事件通知:BindingList 提供了一些额外的事件,如 ListChanged,这可以让你知道列表何时被修改。List 没有这样的事件。
  3. 性能:由于 BindingList 提供了额外的功能,所以在某些情况下,它可能比 List 慢一些。如果你不需要数据绑定或更改通知,那么 List 可能会提供更好的性能。

绑定数据源:

   dataGridView1.DataSource = students;

更改数据源的值,查看UI是否会自动改变:

 students[0].Home = "厦门";
 students[1].Home = "厦门";  

实现的效果如下所示:

值的改变3

发现当数据的值发生改变时,dataGridView1会自动进行更新。

编辑dataGridView1查看数据源是否会发生改变,编辑之后如下图所示:

image-20240318163841499

查看结果:

 Debug.WriteLine(students[0].Home);
 Debug.WriteLine(students[1].Home);

结果如下图所示:

image-20240318163929141

说明编辑dataGridView1产生的更改也会导致数据源的更改。

总结

以上就是在winform中实现双向数据绑定的一次实践,要点有两个,第一个是类实现INotifyPropertyChanged,第二个是用BindingList<T>代替List<T>,希望对你有所帮助。

标签:people,绑定,List,BindingList,dataGridView1,双向,Home,winform
From: https://www.cnblogs.com/mingupupu/p/18080974

相关文章

  • 双向链表
    rt_inlinevoidrt_list_init(rt_list_t*l){l->next=l->prev=l;}/***@briefinsertanodeafteralist**@paramllisttoinsertit*@paramnnewnodetobeinserted*/rt_inlinevoidrt_list_insert_after(rt_list_t*l,rt_list_t*n){......
  • Winform编程详解十:ListBox 列表框
     一、属性介绍    1.(Name)           控件的对象标识符ID    2.Items        控件的数据集合    3.BackColor        控件的背景颜色    4.BorderStyle     ......
  • 【Python使用】python高级进阶知识md总结第4篇:静态Web服务器-命令行启动动态绑定端口
    python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:操作系统,虚拟机软件,Ubuntu操作系统,Linux内核及发行版,查看目录命令,切换目录命令,绝对路径和相对路径,创建、删除文件及目录命令,复制、移动文件及目录命令,终端命令格式的组成,查看命令帮助。HTTP请求报文,HTTP响应报文......
  • 电路方案分析(十八)四开关buck-boost双向同步DC/DC变换器方案
    tip是:资料来自网络,仅供学习交流使用!1.概述4开关降压升压双向DC-DC电源转换器在很多应用中都有使用。作为一个同步降压或同步升压转换器,其中只有两个开关切换,开关损耗减少到一半。只有当直流母线和电池电压彼此接近,然后转换器作为一个同步降压-升压转换器,其中所有四个开关......
  • 小白解决Win11(Win10)下.html文件默认打开方式无法修改,绑定为IE浏览器 iexplorer.exe
    解决方法按Win+R键,输入regedit,地址栏输入计算机\HKEY_CLASSES_ROOT\IE.AssocFile.HTM\shell\opennew\command双击(默认),将"C:\ProgramFiles(x86)\internetexplorer\iexplore.exe"%1修改成"你的浏览器的路径"%1(英文的双引号不要去掉)OK了如何查找浏览器的路径打开任......
  • 滴水逆向笔记系列-c++总结2-36.权限控制-37.虚函数-38.多态_绑定
    第三十六课c++3权限控制1.定义和实现分开写2.private和publicprivate权限说明私有变量在类外是无法访问的,只有在类内或者使用类内函数访问类内函数访问3.private真的不能访问吗反汇编看看t对象在初始化public和private成员时都是一视同仁的,在底层还是没区别,都是编......
  • 滴水逆向笔记系列-PE总结4-31.重定位表-32.IAT表_导入表-33.绑定导入表
    第三十一课重定位表一.引入重定位表1.程序加载过程程序加载后,操作系统会给程序分4GB虚拟内存,先装载自身的.exe:如先把ipmsg.exe拉伸贴到ImageBase(0x00400000),分配空间大小为SizeOfImage(0x3D000)但并不是所有文件的ImageBase都是0x400000,这个值是可以修改的:打开VC->右键你的......
  • 新鲜出炉!界面控件DevExpress WinForms 2024产品路线图预览(三)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!本文将介绍2024年DevExpressWinForms第一个主要更新......
  • 在WinForms中的使用FluentScheduler实现定时任务
     在WinForm程序中使用 FluentScheduler框架实现一个多任务的定时执行功能。 1、使用Nuget安装 FluentScheduler包,默认使用最新稳定版2、以下是实现功能的代码:1usingSystem;2usingSystem.Windows.Forms;3usingFluentScheduler;45publicpartialclas......
  • 动态生成UniCheckBox列,并绑定事件和下标访问
     procedureTmainform.checklistboxclick(Sender:TObject);beginif(senderasTUniCheckBox).CheckedthenbeginShowMessage((senderasTUniCheckBox).Caption);end;//YoucanusecheckortagortheotherpropertiesofTunicheckBoxend;procedur......