使用BindingList来实现DataGridview数据源为list时的动态增删改

当DataGridview的数据源list的时候,对list进行操作后重新绑定,数据并不会更新

使用BindingList能很好的解决这个问题(framework2.0新增)

例如,使用list时候的代码

/// <summary>

    /// 性别类型维护

    /// </summary>

    public partial class SexFrm : Form

    {

        IList<SystemCode> list;

      

       

        private void BindData()

        {

            list =new SystemCodeManager().GetModelByType(type);

            dgvSexType.DataSource = list;

        }

        private void btnAdd_Click(object sender, EventArgs e)

        {

            SystemCode sys = new SystemCode();

            sys.CodeNo = "";

            sys.EnglishName = "";

            sys.ID = 12312;

            sys.Name = "";

            sys.QuickSign = "";

            sys.Remark = "";

            sys.Type = type;

            list.Add(sys);

        }

}

  这样的情况下,数据源改变,实际显示数据并没有改变

即时你在add的方法里重新绑定数据源

dgvSexType.DataSource = list;

依然如此.

在此,使用<span class="Apple-style-span" style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; white-space: normal;">BindingList就可以很好的解决这个问题了.</span>

/// <summary>

    /// 性别类型维护

    /// </summary>

    public partial class SexFrm : Form

    {

        int type = 2;

        SystemCodeManager sysManager = new SystemCodeManager();

        BindingList<SystemCode> list;

     

        private void SexFrm_Load(object sender, EventArgs e)

        {

            new BaseCode.LanguageSeting().LoadLanuageSettings(this);

            BindData();

        }

        private void BindData()

        {

            list = new BindingList<SystemCode>(new SystemCodeManager().GetModelByType(type));

            dgvSexType.DataSource = list;

        }

        private void btnAdd_Click(object sender, EventArgs e)

        {

            SystemCode sys = new SystemCode();

            sys.CodeNo = "";

            sys.EnglishName = "";

            sys.ID = 12312;

            sys.Name = "";

            sys.QuickSign = "";

            sys.Remark = "";

            sys.Type = type;

list.Add(sys);

<span class="Apple-style-span"><br></span><span class="Apple-style-span">

        }

</span>

}

  

<span style="font-family: verdana, Arial, Helvetica, sans-serif;">这样子,就可以轻松的实现和DataGridview互动了</span>

<span style="font-family: verdana, Arial, Helvetica, sans-serif;">效果如图</span>

<span style="font-family: verdana, Arial, Helvetica, sans-serif;">点击新增后可以直接新增,如果使用list,就没有任何反应</span>

<span style="font-family: verdana, Arial, Helvetica, sans-serif;"><br></span>

<span style="font-family: verdana, Arial, Helvetica, sans-serif;">注意:BindList需要引用System.ComponentModel命名空间</span>

面向对象中集合类一般都会实现接口IbindingList, 因为 ,在绑定数据源的时候,如果数据源实现了IbindingList 那么界面可以与之实行互动。无意中发现了微软在2.0增加了一个新类,BindingList<T>,这个类从Collection<T>断承,并实现了IbindingList.

IbindingList 的魅力之处就在于他有AddNew,ApplySort,ListChangedEventHandler 等方法。而BindingSource 是控件的数据源和真正的数据源之间的桥梁,它可以调用IbindingList 的数AddNew等方法。同时IbindingList有数据发生改变的时候又会通知BindingSource从而更新界面。

MS 的 BindingList<T>还不支持sort ,search.,这是因为不知T为何东东有关系,要想实现些功能只有自己扩展了。BindingList<T>有点遗憾的是没有记下删除的数据,这与功能强大的表还是无法相比。从面向对象都已经到面向方面了,怎么在基础类中对面向对象支持还是不太完美呢。现在在研究,对象实体,集合,欢迎各位大师前来指教。

下面是MSDN上对BindingListr 的说明,代码示例演示如何绑定到一个包含业务对象的 BindingList 组件。

http://msdn2.microsoft.com/zh-cn/library/ms132679.aspx#Mtps_DropDownFilterTextBindingList 类可以用作创建双向数据绑定机制的基类。BindingList 提供IBindingList 接口的具体泛型实现。这样就不必实现完整的 IBindingList 接口,实现完整接口可能会因 IBindingList、IEditableObject 和关联的 CurrencyManager 之间微妙的交互而变得比较困难。不过,典型的解决方案程序员将使用提供数据绑定功能的类(如 BindingSource),而不是直接使用 BindingList

BindingList 通过可扩展的 AddNew 方法支持工厂创建的实例。(在 BindingSource 等其他类中也存在这种类型的扩展性)此外,由于此类实现 ICancelAddNew 接口,因此它通过 EndNew 和 CancelNew 方法实现新项的事务性提交或回滚。

时间: 2024-10-10 15:29:07

使用BindingList来实现DataGridview数据源为list时的动态增删改的相关文章

WinForm程序用使用List对象绑定DataGridView数据源

1. 在用List<T>对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List<T>对象集合中的数据发生变化,那么数据控件的数据源是不会得到更新的. 一般也不建议用List<T>去填充数据显示控件的数据源. 如果一定要用List<T>对象去绑定数据源,那么首先设置DataGridView的DataSource属性为new List<T>(),然后再将List<T>集合重新赋值给DataSource属性

winform窗体(六)——DataGridView控件及通过此控件中实现增删改查

DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx>();      dataGridView1.DataSource = list;      //设置不自动生成列,此属性在属性面板中没有      dataGridView1.AutoGenerateColumns = false;      //取消加载默认选中第一行      dataGridView1

使用DataGridView进行增删改查,并同步到数据库

DataGridView控件具有极高的可配置性和可扩展性.它提供有大量的属性.方法和事件,能够用来对该控件的外观和行为进行自己定义.以下通过一个小样例来展示DataGridView进行增删改查,并同步到数据库的功能. 窗口展示: 用户需求: 1.当窗口显示时,将数据库中用户表中的数据显示出来. 2.选中一行,运行删除操作,同一时候在数据库中对应数据被删除. 3.双击某个数据,进行编辑,或者在空白行加入新的数据,然后点击更新,数据库随之更新. 代码展示: Public Class Form1'代码

WinForm DataGridView增删改查

连接数据库对表进行增删改查 1.绑定数据源 //做一个变量控制页面刷新 public static int bs = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { JianSanDA da = new JianSanDA(); //绑定数据源 dataGridView1.DataSource = da.Select(); //设置不自动生成列 d

Winform开发之DataGridView的增删改

DataGridView是一个非常强大的控件,用法很多.这里介绍一个简单的增删改例子. 贴效果图 右侧输入学生信息点击新增,将数据增加到数据库,并且加载到datagridview中,点击选择某条数据修改,将选择的数据加载到右侧的编辑框内,修改后点击修改即可,也可直接删除. 贴代码 public partial class Form1 : Form { private static string strConn = "Data Source=210.26.111.80;Initial Catalo

ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)

在上讲中<ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版>,我们已经结合Visual Studio 2013搭建好了ActiveReports 9的开发环境,并完成了一个Hello World的RDL报表. 在本文,我们通过配置数据源进行报表实战,做过报表开发的报表达人知道,报表中的数据源分设计时数据源和运行时数据源. 如何理解呢? 这2类数据源,表结构是一样的,用途不一样: 1 设计时数据源,用于研发内部.报表小组进行配置.测试报表

DataSet之增删改查操作(DataGridView绑定)

DataSet数据集,数据缓存在客户端内存中,支持断开式连接.DataGridView控件绑定DataSet时,它自动的改变的DS的行的状态,而且在做增删改查的时候,可以借助SqlCommandBuilder类来完成. SqlCommandBuilder必须执行SELECT命令来检索元数据,所以它要求多往返服务器一次,从而增加了应用程序的开销,而且操作的表必须要有主键约束.优点是自动建立insertcommand等命令 1,添加操作 private void button2_Click(obje

DataGridView 上增删改同步Access数据库

准备工作: 用Visual Studio新建一个WinForm项目,在Form1中放上一个datagridview控件,两个按钮控件. 在项目所在文件夹目录bin/debug/ 下新建一个Access数据库,名字Database. 这里要注意,数据库后缀名最好是.mdb (access 2002-2003数据库). 如果用.accdb(access2007)格式,就需要下载并安装Access 2007 runtime, 因为07版使用的Provider Engine与原来不同,而且Office2

扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应listchang事件,导致后端的grid等控件不能更新数据.废了好大的劲终于找到一个UIBindingList,实现线程数据的同步! using System; using System.ComponentModel; using System.Threading; using System.Wi