近期接手一個winform 項目,雖然之前有.net 的經驗,但是對一些控制項的用法還不是很熟悉。 這段時間將會記錄一些在工作中遇到的坎坷以及對應的解決辦法,寫出來與大家分享並希望大神提出更好解決方法來促進進步。 我也會儘可能把我查找到資料的出處引出來,以此來感恩對我提供幫助的人們。 正題如下 一、關 ...
近期接手一個winform 項目,雖然之前有.net 的經驗,但是對一些控制項的用法還不是很熟悉。 這段時間將會記錄一些在工作中遇到的坎坷以及對應的解決辦法,寫出來與大家分享並希望大神提出更好解決方法來促進進步。 我也會儘可能把我查找到資料的出處引出來,以此來感恩對我提供幫助的人們。
正題如下
一、關於Winform下DataGridView中實現checkbox全選反選、同步列表項的處理
1.checkbox的添加:在設計頁面選擇編輯列在新添加的列中註意如下幾個屬性:
SortMode = NotSortable :禁止排序,點擊表頭進行全選/反選時 和排序事件是無關的,雖然不會有質的影響,但是我還是禁止了
ColumnType = DataGridViewCheckBoxColumn:這就是核心點了 設置列的屬性為覆選框
DataPropertyName = iChecked : 這個又是一個建議的選擇,最好有欄位與之對應,這樣開發起來更加方便
HeaderText = □:這是我一個投機取巧的方式,如果在表頭添加覆選框對後續的開髮帶來很多麻煩,所以這裡用□代表反選 √代表全選
2.DataGridView相關屬性的設置:
//使顯示的列和空間中設定的列一致,否則會按照dataTable中的列顯示
dgv.AutoGenerateColumns = false;
//不添加此語句 會多出一列
dgv.AllowUserToAddRows = false;
3.全選/反選核心代碼
添加ColumnHeaderMouseClick 事件
核心代碼如下
if (e.ColumnIndex == 0)
{
dgv.ClearSelection();
dgv.CurrentCell = dgv[1, 0];//如果沒有這句代碼,如果覆選框列有某個單元格獲得焦點時,雖然全選,但是此單元格依然不能選中 這句話的意思就是把焦點移出去
if (ck.HeaderText == "□")
{
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells[0].Value = true;
}
ck.HeaderText = "√";
}
else
{
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells[0].Value = false;
}
ck.HeaderText = "□";
}
}
4.列表中的覆選框處罰表頭的改變處理方式及核心代碼
添加CellContentClick事件 至於為什麼添加這個事件,網上有很多文章描述,我不必在此細說
if (e.ColumnIndex == 0 && e.RowIndex != -1)
{
int sum = 0;
for (int i = 0; i < dgv.RowCount; i++)
{
//必須使用這個屬性 EditedFormattedValue 這個屬性也是關鍵 這裡不用value是因為不是實時的數據 網上更多詳細資料如果想深入研究可以自己查資料
if ((bool)dgv.Rows[i].Cells[0].EditedFormattedValue)
{
sum++;
}
}
if (sum == dgv.RowCount)
{
ck.HeaderText = "√";
}
else
{
ck.HeaderText = "□";
}
}
相關參考文章:
https://www.cnblogs.com/emanlee/archive/2009/07/21/1528074.html
https://www.cnblogs.com/chaobaojun/archive/2010/05/13/1734509.html