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. swiper使用心得

    引入: <link rel="stylesheet" href="https://cdn.bootcss.com/Swiper/3.4.2/css/swiper.m ...

  2. PL/SQL 11.6 注册码

    PL/SQL Developer 下载地址:Download PL/SQL Developer 11.0.6 注册码 Product Code:4t46t6vydkvsxekkvf3fjnpzy5wb ...

  3. KMS使用CLion作为IDE来调试

    KMS使用CLion作为IDE来调试,打开kms相应模块的目录,CLion自动识别相应的CMakeLists.txt. 然而会make失败,经搜索,看到Clion使用的自带的cmake,因此系统中安装 ...

  4. C#将String传入C++的char*

    C++的函数参数列表中包含一个char*的输出型参数,然而在C#调用该dll时候,会自动将函数的中的char*参数“翻译”为sbyte*, 使用了各种方法都不能调用函数,主要是不能合适的转换为sbyt ...

  5. 洛谷P1280 尼克的任务 [DP补完计划]

    题目传送门 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从 ...

  6. 洛谷P1730最小密度路径

    题目传送门; 首先理解题目,究其本质就是一个最短路问题,而且数据范围贼水,用floyd完全没问题,但是题目有变化,要求出路径边权值与边数之比,这里就可以考虑在把floyd中的二维数组变为三维,f[ i ...

  7. es6 Object的几个新方法

    扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal Object.isSealed 冻结对象 Object.freez ...

  8. 子树(LintCode)

    子树 有两个不同大小的二进制树: T1 有上百万的节点:T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 样例 下面的例子中 T2 是 T1 的子树: 1 3 / \ / T1 ...

  9. Luogu P2146 软件包管理器(树链剖分+线段树)

    题意 给定\(n\)个软件包,每个软件包都有一个依赖软件包,安装一个软件包必须安装他的依赖软件包,卸载一个软件包必须先卸载所有依赖于它的软件包.给定\(m\)此操作,每次一个操作\(install/u ...

  10. 十一. 图形、图像与多媒体5.Graphics2D类的绘图方法

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的 ...