程序目标:

  实现DataGridView与BindingList<T>双向绑定。用户通过DataGridView修改值后立即更新BindList对象的值,代码修改BindList后立即更新DataGridView的显示。

实现环境:vs2017 C# WinForm

程序完整代码包:https://pan.baidu.com/s/1LLUxL1UyqNWkXkPF_LuEig

主要代码:

 ///****************************************************************************
/// CLR版本 :4.0.30319.42000
/// 邮 箱 :282780854@qq.com
/// 博 客 :https://www.cnblogs.com/it89/
/// 创 建 者 :龙腾虎跃
/// 创建日期 :2019/1/15 21:02:04
/// 功能描述 :
/// 使用说明 :
///****************************************************************************
using System;
using System.ComponentModel;
using System.Windows.Forms; namespace TestDataGridViewBind
{
public partial class Form1 : Form
{
private DataGridView mDataGridView;
//private BindingSource mBindingSource; //绑定方式一需要的。
private Button mAddItemBtn;
private Button mChangeItemValueBtn;
private Button mDeleteItemBtn; public BindingList<People> Peoples { get; set; } public Form1()
{
this.Load += this.Form1_Load;
InitializeComponent();
}
public void Form1_Load(object sender, EventArgs e)
{
//初始化mDataGridView对象
mDataGridView = new DataGridView();
mDataGridView.AutoSize = true;
mDataGridView.Left = ;
mDataGridView.Top = ; //初始化mAddItemBtn按钮。
this.mAddItemBtn = new Button();
mAddItemBtn.Text = "Add People";
mAddItemBtn.AutoSize = true;
mAddItemBtn.Left = ;
mAddItemBtn.Top = ;
mAddItemBtn.Click += this.mAddItemBtn_Click; //初始化mDeleteItemBtn按钮
mDeleteItemBtn = new Button();
mDeleteItemBtn.Text = "Delete Item";
mDeleteItemBtn.AutoSize = true;
mDeleteItemBtn.Left = ;
mDeleteItemBtn.Top = ;
mDeleteItemBtn.Click += mDeleteItemBtn_Click; //初始化mChangeItemValueBtn按钮。
mChangeItemValueBtn = new Button();
mChangeItemValueBtn.Text = "Change Item Value";
mChangeItemValueBtn.AutoSize = true;
mChangeItemValueBtn.Left = ;
mChangeItemValueBtn.Top = ;
mChangeItemValueBtn.Click += this.mChangeItemValueBtn_Click; //初始化Form1。
this.Controls.Add(mDataGridView);
this.Controls.Add(mAddItemBtn);
this.Controls.Add(mDeleteItemBtn);
this.Controls.Add(mChangeItemValueBtn);
this.AutoSize = true;
this.Text = "DataGridView object binding demo"; //初始化Peoples对象。
Peoples = new BindingList<People>();
Peoples.Add(new People("张三", "北京", ));
Peoples.Add(new People("李四", "上海", ));
Peoples.Add(new People("王五", "深圳", )); //绑定方式一:通过BindingSource对象把Peoples绑定到mDataGridView控件。
//mBindingSource = new BindingSource();
//mBindingSource.DataSource = Peoples;
//mDataGridView.DataSource = mBindingSource; //绑定方式二:直接通过mDataGridView.DataBindings绑定Peoples。Peoples不能引发改变通知事件,但是People类型继承了INotifyPropertyChanged接口,可以引发改变通知事件。
mDataGridView.DataBindings.Add("DataSource", this, "Peoples", false, DataSourceUpdateMode.OnPropertyChanged);
} private void mAddItemBtn_Click(object sender, EventArgs e)
{
this.Peoples.Add(new People("新人", "湖南", ));
} private void mDeleteItemBtn_Click(object sender, EventArgs e)
{
if (this.Peoples.Count > )
{
this.Peoples.RemoveAt();
}
} private void mChangeItemValueBtn_Click(object sender, EventArgs e)
{
if (Peoples.Count > )
{
this.Peoples[].Address = "浙江";
//如果People没有继承INotifyPropertyChanged接口,则需要下面注释的代码,来引发改变通知事件。
//this.Peoples.ResetItem(0);//引发改变通知
} if (Peoples.Count > )
{
this.Peoples[].Age = Peoples[].Age + ;
//this.Peoples.ResetItem(1);//引发改变通知
}
}
}
}

Form1.cs

 ///****************************************************************************
/// CLR版本 :4.0.30319.42000
/// 邮 箱 :282780854@qq.com
/// 博 客 :https://www.cnblogs.com/it89/
/// 创 建 者 :龙腾虎跃
/// 创建日期 :2019/1/15 21:03:04
/// 功能描述 :
/// 使用说明 :
///****************************************************************************
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices; namespace TestDataGridViewBind
{
/// <summary>
///
/// </summary>
public class People : INotifyPropertyChanged
{
#region "Public Section"
public string Name
{
get => mName;
set { mName = value; NotifyPropertyChanged("Name"); }
} public string Address
{
get => mAddresss;
set { mAddresss = value; NotifyPropertyChanged("Address"); }
} public int Age
{
get => mAge;
set { mAge = value; NotifyPropertyChanged("Age"); }
} public People(string name, string address, int age)
{
mName = name;
mAddresss = address;
mAge = age;
} public event PropertyChangedEventHandler PropertyChanged; #endregion #region "Private Section"
private string mName;
private string mAddresss;
private int mAge; /// <summary>
/// 该方法由每个属性Set访问器调用。
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} #endregion
}
}

People.cs

WinForm DataGridView双向数据绑定的更多相关文章

  1. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  2. [Winform] DataGridView 总结(FAQ)

    Q1.  如何使单元格不可编辑? A:设置 ReadOnly 属性,可以设置的对象包括 DataGridViewRow(行).DataGridViewColumn(列).DataGridViewCel ...

  3. 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案

    上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求 ...

  4. vue双向数据绑定原理探究(附demo)

    昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...

  5. 双向数据绑定(angular,vue)

    最近github上插件项目更新了关于双向数据绑定的实现方式,关于angular和vue. angular众所周知是使用的脏检查($dirty).一开始大家会认为angular开启了类似setInter ...

  6. jQuery.my – 实时的复杂的双向数据绑定

    jQuery.my 这个插件用于实时双向数据绑定.它发生变异给出的数据源对象,反映了用户与用户界面之间的相互作用.jQuery.my 提供了全面的验证,条件格式,复杂的依赖关系,运行形式结构操作. 马 ...

  7. Angular双向数据绑定MVVM以及基本模式分析

    MVVM: angular的MVVM实现的是双向数据绑定,模型从服务器端抓取到数据,将数据通过控制器(controller)传递到视图(view)显示,视图数据发生变化时同样也会影响到模型数据的变化, ...

  8. 《AngularJS权威教程》中关于指令双向数据绑定的理解

    在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具 ...

  9. Angular解决双向数据绑定

    <!DOCTYPE html> <html ng-app="myApp1"><body><div ng-controller=" ...

随机推荐

  1. Tair总述

    Tair 是淘宝自己开发的一个分布式 key/value 存储引擎.tair 分为持久化和非持久化两种使用方式.非持久化的 tair 可以看成是一个分布式缓存.持久化的 tair 将数据存放于磁盘中. ...

  2. 树莓派.设置无线网卡为AP工作模式(pi2和pi3)

    树莓派2的设置办法: 1. 安装NetworkManager管理工具(可选),以支持nmcli命令 sudo apt-get install -y network-manager 2. 安装hosta ...

  3. 关于bash

    Linux中有一位名叫"巴士"的tool.他是如何出世的呢?原来,他是一个为GNU计划(GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起 ...

  4. Dubbo中服务消费者和服务提供者之间的请求和响应过程

    服务提供者初始化完成之后,对外暴露Exporter.服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理. 服务消费者经过初始化之后,得到的是一个动态代理类,InvokerIn ...

  5. C++11标准中常用到的各种算法汇总.

    在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据 ...

  6. bzoj3199 [Sdoi2013]escape

    这题真tm是醉了. 就是对于每个亲戚,利用其它的亲戚对他半平面交求出其控制的范围,然后随便跑个最短路就行了 n=0卡了我一下午////// #include <cstdio> #inclu ...

  7. 关于WebSocket需要知道

    WebSocket 概念 WebSocket是再单个TCP连接上进行双工通讯的协议,仅需要通过一次握手两个之间就可以创建持久性的连接,进行双向数据传输.WebSocket 是HTML5新增加的协议. ...

  8. mybatis 增加热加载xml

    由于在本地开发环境上每次修改mybatis xml文件都需要手动重启服务,调试的很麻烦,所以需要热加载xml文件来避免浪费时间,于是网上搜一下资料,看了下有一大堆,但试了下真正能跑起来没有(大都代码没 ...

  9. php架构之路

    鉴于最近跟小伙伴聊了很多PHP架构发展方向的问题,相关技术整理了一下,也顺便规划了一下自己的2019年. 一.常用的设计模式以及使用场景 以下是我用到过的   工厂,单例,策略,注册,适配,观察者,原 ...

  10. Visual Studio Code 中文界面设置

    Visual Studio Code 中文界面设置 昨天,想要试一下用 VS Code 写 Markdown 格式的博客,下载下来发现是英文界面: 按照我以前的经验应该会自动提示切换语言的,但是这次等 ...