在winform中实现双向数据绑定的方法

 更新时间:2024年03月19日 08:25:32   作者:Dm_dotnet  
双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步,今天我想通过winform中DataGridView控件为例,介绍在winform中如何实现双向数据绑定,需要的朋友可以参考下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

什么是双向数据绑定?

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

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

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

创建数据源

以Person类为例:

1
2
3
4
5
public class Person
{
    public string? Name { get; set; }
    public string? Home { get; set; }
}

创建Person对象列表:

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

绑定数据源:

1
dataGridView1.DataSource = people;

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

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

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

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

结果如下图所示:

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

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

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

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

如果我们这样写的话:

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

效果如下所示:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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接口。

创建数据源:

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

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

BindingList<T>List<T>的区别

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

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

绑定数据源:

1
dataGridView1.DataSource = students;

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

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

实现的效果如下所示:

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

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

查看结果:

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

结果如下图所示:

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

总结

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

到此这篇关于在winform中实现双向数据绑定的方法的文章就介绍到这了,更多相关winform双向绑定数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://juejin.cn/post/7347616740853268530

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C#使用非托管代码直接修改字符串的方法

    C#使用非托管代码直接修改字符串的方法

    在string方法中,如ToUpper等字符串操作方法,都会产生一个新的字符串,这样增大了运行开支。一个替代方案是通过非托管代码直接操作字符串。如替代ToUpper方法:
    2013-07-07
  • WPF基础教程之元素绑定详解

    WPF基础教程之元素绑定详解

    这篇文章主要给大家介绍了关于WPF基础教程之元素绑定的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧
    2017-08-08
  • 配置C#的系统环境变量的方法

    配置C#的系统环境变量的方法

    配置C#的系统环境变量的方法...
    2007-03-03
  • c#在控制台输出彩色文字的方法

    c#在控制台输出彩色文字的方法

    c#在控制台输出彩色文字的方法,需要的朋友可以参考一下
    2013-03-03
  • C#实现折半查找算法

    C#实现折半查找算法

    这篇文章介绍了C#实现折半查找的算法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#实现获取设置IP地址小工具

    C#实现获取设置IP地址小工具

    c# 开发,方便更改IP地址。由于公司和家里的ip设置不一样,公司要求手动设置,在家可以自动获取IP,切都是无线网络,为了方便操作,故做了这个小工具!
    2015-06-06
  • openfiledialog读取txt写入数据库示例

    openfiledialog读取txt写入数据库示例

    这篇文章主要介绍了openfiledialog读取txt写入数据库示例,需要的朋友可以参考下
    2014-03-03
  • c# COM组件原理详解

    c# COM组件原理详解

    本文主要介绍了c# COM组件原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • c# linq的差集,并集,交集,去重代码(分享)

    c# linq的差集,并集,交集,去重代码(分享)

    下面小编就为大家分享一篇c# linq的差集,并集,交集,去重代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论