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

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;

        }

posted @ 2013-01-05 15:30  CherishFu  阅读(14955)  评论(0编辑  收藏  举报