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;

        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM