DataGridView绑定泛型List时,利用BindingList来实现增删查改 

一、   DataGridView绑定泛型List的种种

1、DataGridView数据绑定对比(DataTable与泛型List):
  当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView。
  当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给DataGridView的DataSource。

绑定List时,注意:切莫将DataGridView的DataSource设置为Null,否则会破坏DataGridView的列结构。

2、数据绑定后的添加删除问题:
  如果要对绑定在DataGridView中的List<T>进行数据的添加删除,先要把List<T>转换成BindingList<T>,再进行绑定:DataGridView.DataSource=new BindingList<T>(new List<T>)。否则的话会产生许多意想不到的错误。
如:初始绑定空数据后再添加数据绑定后,却取不到DataGridView.CurrentCell属性。

3、使用泛型绑定依然可以添加删除:
  IList<T> list= new List<T>();
  DataGridView.DataSource=list;//DataGridView的行不能添加删除
  DataGridView.DataSource=new BindingList<T>(list);//DataGridView的行可以添加删除(只有允许添加行、删除行)

二、   DataGridView绑定泛型List时,利用BindingList来实现增删查改

此处以学生的信息为例,演示界面如下:

项目目录如下:

Student这个model类里面的代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace DGVBandingList

{

class Student

{

public string StudentID { get; set; }

public string StudentName { get; set; }

public string Telephone { get; set; }

public string QQ { get; set;}

}

}

对Form1操作的代码(含注释)如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace DGVBandingList

{

public partial class Form1 : Form

{

//定义一个IList的学生链表

private IList<Student> IStudent = new List<Student>();

//定义一个BindingList的学生链表

private BindingList<Student> BStudent;

public Form1()

{

InitializeComponent();

//假设此为List的初始数据

initialData();

//将IList中的值赋给对应的BindingList

BStudent = new BindingList<Student>(IStudent);

//将DataGridView里的数据源绑定成BindingList

this.dgvStudentInfo.DataSource = BStudent;

}

private IList<Student> initialData()

{

for (int i = 0; i < 3; i++)

{

Student initialSt = new Student();

initialSt.StudentID = "ID" + i;

initialSt.StudentName = "name" + i;

initialSt.Telephone = "tel" + i;

initialSt.QQ = "QQ" + i;

IStudent.Add(initialSt);

}

return IStudent;

}

private void btnAdd_Click(object sender, EventArgs e)

{

Student studentTemp = new Student();

studentTemp.StudentID = "S1001";

studentTemp.StudentName = "张三";

studentTemp.Telephone = "123456789";

studentTemp.QQ = "45621578";

//BindingList的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView

BStudent.Add(studentTemp);  //默认添加到DGV的最后一行

}

private void btnDelete_Click(object sender, EventArgs e)

{

//允许删除多行

DataGridViewSelectedRowCollection rows = this.dgvStudentInfo.SelectedRows;

foreach (DataGridViewRow row in rows)

{

this.BStudent.RemoveAt(row.Index);

}

//若想每次只能删除一行

//得到当前选中行的索引

//int index = this.dgvStudentInfo.CurrentRow.Index;

//根据索引,删除DataGridView里面选中的记录

//this.BStudent.RemoveAt(index);

}

//使用insert的时候首先要在界面上选择一行,表示插入这行之后

//否则默认插入第一行之后,因为第一行是默认被选中的。

private void btnInsert_Click(object sender, EventArgs e)

{

int index = this.dgvStudentInfo.SelectedRows[0].Index + 1;

Student insertStudent = new Student();

insertStudent.StudentID = "S2001";

insertStudent.StudentName = "王五";

insertStudent.Telephone = "4522166655";

insertStudent.QQ = "895545512";

BStudent.Insert(index, insertStudent);

}

private void btnModify_Click(object sender, EventArgs e)

{

//因为DGV里是整行选择,故先将所选行装配成一个model

Student modifySt = this.dgvStudentInfo.CurrentRow.DataBoundItem as Student;

//得到当前选中行的索引

int index = this.dgvStudentInfo.CurrentRow.Index;

//做出修改,如修改电话号码为aaaa

modifySt.Telephone = "aaa";

//删除当前行

this.BStudent.RemoveAt(index);

//添加修改后的行

this.BStudent.Insert(index, modifySt);

}

}

}

界面演示的结果:

运行初始:

点击“添加”按钮后:

点击“删除”按钮,若选择删除第二行:

点击“插入”,选择插在name2下面:

点击“修改”,修改最后一行,即张三:

最后,值得注意的是:

以上的“添加”,“删除”,“插入”,“修改”操作只是对BindingList做了改变,反映到了DataGridView里面,但并没有去变动List中的值,所以如果想要List也随之而改变的话,可以在相应的方法里面调用一下的方法:

//下面这个方法就是把界面的DataGridView里的数据源BindingList转换为List。

private IList<Student> BindingListToList()

{

IList< Student > list = new List< Student >((BindingList< Student >)this.dgv.DataSource);

return list;

}

 
分类: winfo

DataGridView绑定泛型List时,利用BindingList来实现增删查改的更多相关文章

  1. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  2. C# DataGridView绑定List对象时,利用BindingList来实现增删查改

    当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView.  当Da ...

  3. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  4. 在MVC中使用泛型仓储模式和依赖注入实现增删查改

    标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...

  5. java 利用注解实现BaseDao 增删查改

    第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...

  6. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. 在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  8. winform datagridview 绑定泛型集合变得不支持排序的解决方案

    原文:winform datagridview 绑定泛型集合变得不支持排序的解决方案 案例: 环境:Winform程序 控件:Datagridview 现象:Datagridview控件绑定到List ...

  9. WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决

    背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...

随机推荐

  1. nodejs里的express自动刷新gulp-express使用【转载】

    搬运自[http://blog.csdn.net/zhu_free/article/details/51476525] gulp-express实现实时刷新 本来使用gulp-connect可以创建本 ...

  2. (error) DENIED Redis is running in protected mode because protected mode is enabled

    在通过Java程序链接配置好的redis服务时出现 DENIED Redis is running in protected mode because protected mode is enable ...

  3. "The /usr/local directory is not writable."解决方法

    sudo chown -R $(whoami) /usr/local brew prune

  4. Java实现蛇形矩阵

    public class Solution { //下x++ 左y-- 上x-- 右y++ public void prints(int n) { int[][] mp = new int[n][n] ...

  5. shell脚本报错退出

    在shell脚本中,比如有以下的代码: cd /root/test88 rm -rf  backup 如果目录/root/test88不存在,脚本不会停止,依然会执行rm -rf backup这个命令 ...

  6. Web会话安全分析工具ProxyStrike

    Web会话安全分析工具ProxyStrike   在Web应用中,客户端发出一次请求,服务器响应一次.这构成一个完整的会话.通过分析请求和响应的数据,可以发现Web应用存在的漏洞.Kali Linux ...

  7. [Agc008F]Black Radius

    [AGC008F] Black Radius Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息 ...

  8. Gym 101128F Sheldon Numbers(网络流)

    [题目链接] http://codeforces.com/gym/101128/attachments [题目大意] 给出一张地图,分为高地和低地,高低地的交界线上划有红线, 现在要开小车跨过每条红线 ...

  9. 【分块】MIPT-2016 Pre-Finals Workshop, Taiwan NTU Contest, Sunday, March 27, 2016 Problem A. As Easy As Possible

    给你一个字符串,多次区间询问,问你在该区间内最多能有几个easy重复的子序列. 显然如果只有一次询问,从左到右贪心做即可. 分块,预处理任意两块间的答案,不过要把以e a s y开头的四个答案都处理出 ...

  10. css样式介绍

    1 css之选择器 1.1 基本选择器 1.2 组合选择器 E,F      多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔:div,p { color:#f00; } E F     ...