码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 在winform中如何实现双向数据绑定?


    合集 - C#(25)
    1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-11-175.C#中的属性2023-11-206.C#winform中使用SQLite数据库2023-11-237.C#简化工作之实现网页爬虫获取数据2023-11-278.C#中的委托(一)2023-11-299.C#中的ref关键字2023-11-2910.C#中out关键字2023-11-2911.C#中内置的泛型委托Func与Action2023-12-0412.在winform blazor hybrid中绘图2023-12-1313.使用C#如何监控选定文件夹中文件的变动情况?2023-12-2814.C#设计模式之策略模式01-0215.由浅入深理解C#中的事件01-0416.C#设计模式之观察者模式01-0417.C#设计模式之单例模式01-0818.C#基于ScottPlot进行可视化01-1319.C#使用MiniExcel导入导出数据到Excel/CSV文件02-1020.winform实现最小化至系统托盘02-1921.C#使用Bogus生成测试数据02-2722.SemanticKernel如何基于自有数据聊天03-0523.在winform中如何嵌入第三方软件窗体✨03-07
    24.在winform中如何实现双向数据绑定?03-18
    25.自己动手做一个批量doc转换为docx文件的小工具03-20
    收起

    什么是双向数据绑定?

    双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(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 people = new List()
      {
          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 students = new BindingList()
     {
             new Student { Name = "张三", Home = "武汉" },
             new Student { Name = "李四", Home = "南昌"  },
             new Student { Name = "王五", Home = "福州"  },
     };
    

    注意这里使用的是BindingList而不是List。

    image-20240318125228934

    BindingList与List的区别

    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代替List,希望对你有所帮助。

  • 相关阅读:
    微服务面试题
    软件流程和管理(六):Project Scheduling
    Transform介绍(1)
    Spring(AOP)
    friewall/ansible
    Python+医学院校二手书管理 毕业设计-附源码201704
    界面组件DevExpress WPF v22.1 - 全新升级类Office、Excel功能
    京东架构师呕心整理:jvm与性能调优有哪些核心技术知识点
    复杂度为O(NlogN)的归并排序
    ceph trash 调研
  • 原文地址:https://www.cnblogs.com/mingupupu/p/18080974
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号