最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyChanged解决此问题。

案例如下:

首先定义一个类:Customer

    public class Customer
{
public string CustomerName { get; set; }
public string PhoneNumber { get; set; }
}

创建一个绑定数据集:

private BindingList<Customer> customers = new BindingList<Customer>();

向数据集中添加数据并绑定到控件:

customers.Add(new Customer() { CustomerName = "张三", PhoneNumber = "010-5263" });
customers.Add(new Customer() { CustomerName = "李四", PhoneNumber = "010-8823" });
dataGridView1.DataSource = customers;

修改数据源:

customers[0].CustomerName = "王五";

此时,dataGridView1中没有及时刷新显示新数据。因为数据修改时并没有通知到控件,为此让Customer实现INotifyPropertyChanged接口,该接口只包含一个事件,当属性值改变时,触发该事件,从而导致注册该事件的方法被执行,达到通知控件的目的。这是通过事件实现观察者模式。

Customer实现INotifyPropertyChanged接口:

    public class Customer:INotifyPropertyChanged
{
private string _customerName;
private string _phoneNumber; public string CustomerName
{
get { return _customerName; }
set
{
if(_customerName!=value)
{
_customerName = value;
PropertyChanged(this, new PropertyChangedEventArgs("CustomerName"));
}
}
} public string PhoneNumber
{
get { return _phoneNumber; }
set
{
if (_phoneNumber != value)
{
_phoneNumber = value;
PropertyChanged(this, new PropertyChangedEventArgs("PhoneNumber"));
}
}
} public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

此时,再次执行修改数据源的代码,控件会及时刷新数据显示,因为属性值改变时通知了控件进行相应的处理。

如果在数据源中添加或删除一条数据,控件也会及时刷新显示,怎么回事?原来BindingList<T>实现了IBindingList接口,该接口声明了事件 ListChangedEventHandler,BindingList<T>在添加或删除记录时,触发该事件。显然,控件在绑定数据集(customers)时,订阅了该事件。

C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)的更多相关文章

  1. WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged

    .Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...

  2. Swing界面刷新问题(转)

    在Java Swing编程中,往往会遇到需要动态刷新界面的时候,例如动态刷新JLabel的文本,JTextField里的文本等等.但是往往却没有达到我们预期的效果,我相信很多朋友都遇到过本文将要说的这 ...

  3. androidTv界面刷新跳动的问题

    今天刚完成老大要求的新模块,在界面刷新的时候遇到了一些问题:一个scrollview动态的添加控件且控件中的数据进行更换的时候,出现的界面跳动的问题 刚开始以为是界面没有展示完全配合scrollvie ...

  4. Android界面刷新之invalidate与postInvalidate的区别

    Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ...

  5. Android之界面刷新(invalidate和postInvalidate使用)

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...

  6. Android界面刷新

    Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...

  7. Android界面刷新方法

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  8. JS新界面关闭原界面刷新的多种形式

    ------------恢复内容开始------------ 1.新界面为当前界面弹出的形式: 第一步:首先原界面的原生JS事件需要放到 (function () {  ......  })(); 中 ...

  9. sessionStorage记录返回前端的数据,用于解决登录拦截器刷新页面的问题

    1.问题出现的场景与解决 实现一个登录拦截器,重写doFilter方法,判断用户的登录状态,在用户长时间未操作或者异地登录时前端进行提示,完整代码如下 public class LoginValida ...

随机推荐

  1. Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous

    错误描述: 今天在使用Qt写一个C++函数模板的测试程序的时候,编译的时候,编译的时候出现如下错误: 错误描述为:在main函数中,进行函数max()重载时,出现(ambiguous)含糊的,不明确的 ...

  2. 关于stm32的正交解码

    关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说 ...

  3. [转载] fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    说明: 转载自http://www.cnblogs.com/skywang12345/p/3308762.html概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对 ...

  4. Microsoft Visual Studio正忙解决办法

    问题描述 前段时间用vs2015进行开发.出现如下问题,关闭vs进程重启vs还是无法解决. 如何解决 进入本地项目.vs文件夹 这个文件夹下有个.suo文件,删除该文件,用任务管理器杀掉vs的进程,重 ...

  5. easyuidatagrid中load,reload,loadData的区别。

    摘要:datagrid中有load,reload,loadData那三个方式,皆是加载数据的,但又有差别.下面让我们一起来看看: 首先,load方法,比如我已经定义一个datagrid的id为grid ...

  6. Ztree行政地区树状展示

    Ztree行政地区树状展示(点击加载) 效果如下: 开始贴代码: 实体类 Item,用于对Ztree的节点展示 public class Item { private String id; priva ...

  7. WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目 ...

  8. java JFileChooser选择文件和保存文件

    //文件过滤器import java.io.File; import javax.swing.filechooser.FileFilter; public class MyFilter extends ...

  9. jQuery.validationEngine.js学习

    项目中使用到了这个插件,抽了个空,看了一下. (function($){ var method ={} $.fn.validationEngine = function(){} $.validatio ...

  10. CentOS 7 关闭防火墙和SELinux

    [修改机器名] # vi /etc/hostname [关SELinux] # vi /etc/selinux/config设置SELINUX=disabled [关防火墙] # systemctl ...