程序目标:

  实现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. MySQL 的性能(下篇)—— 性能优化方法

    简介 文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明 本文分为上下两篇: 上篇:MySQL 的 SQL 执行分析 下篇:MySQL 性能优化 下面为下篇内容,分为以下部分: 一.创建表时 ...

  2. 在线OJ使用总结(acm)

    赛码网OJ规则 用readLine()代替read_line() 用readLine()代替read_line() 用readLine()代替read_line() 用readLine()代替read ...

  3. latex中长公式换行,很好的办法

    今天在编辑公式时,有一个公式很长,写到一行就出去了.当时之前换行都是方程组或者在括号完之后换,都没有问题.但是今天我也换行的是在括号中间断开.这样出现问题,编辑的时候会出错误提醒.上网查了一些论坛,也 ...

  4. key.go

    package].Key)         if err = waitDelete(ctx, client, lastKey, resp.Header.Revision); err != nil { ...

  5. Linux下网站根目录权限

    网站根目录权限遵循: 文件644 文件夹755 权限用户和用户组www-data 如出现文件权限问题时,请执行下面3条命令: chown -R www-data.www-data /usr/local ...

  6. HTTP 和 WebSocket的区别

    有关http和WebSocket 的区别网上有很多的质料. 个人在此仅仅是记录以下自己的学习心得,自己的理解. 1. http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要 ...

  7. 从Java继承类的重名static函数浅谈解析调用与分派

    在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是 ...

  8. 原生wcPop.js消息提示框(移动端)、内含仿微信弹窗效果

    wcPop.js移动端消息对话框插件是之前的wxPop.js的升级版,优化了js和css,并且新增了仿微信弹窗效果, 是一款含有多种情景模式的原生模态消息对话框代码,可用于替代浏览器默认的alert弹 ...

  9. Appium 【已解决】提示报错:Attempt to re-install io.appium.android.ime without first uninstalling.

    详细报错:Failed to install D:\AutoTest\appium\Appium\node_modules\appium\build\unicode_ime_apk\UnicodeIM ...

  10. linux 挂载共享文件夹

    1.背景 通常会有这样的场景,开发人员在Windows编写代码,然后放在linux环境编译,我们通过mount命令就可以实现将代码直接挂到linux环境上去,使Windows上的共享文件夹就像linu ...