使用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 方法实现新项的事务性提交或回滚。

 

 

=============================简单案例如下==============

 

class student//内部类
{
public string xm { get; set; }

public int nl { get; set; }
}
List<student> list = new List<student>();
BindingList<student> list2;
private void button3_Click(object sender, EventArgs e)
{
list = new List<student>(){
new student{xm="张三",nl=23},
new student{xm="李四",nl=23},
new student{xm="王五",nl=23}

};
list2 = new BindingList<student>(list); ;
dataGridView1.DataSource = list2;

}

private void button4_Click(object sender, EventArgs e)
{
list2.Add(new student() { xm="刘德华",nl=11});
}

转载于:https://www.cnblogs.com/efreer/p/5826720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值