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;
}