在用 winform 的時候,我們操作表格資料一般使用 GridView 會比較多,這里我總結下我在使用的程序中遇到的一些問題
一、首先創建表單和表格,將表格簡單設定一下,去除最后一行編輯行,去除默認的第一列空白列,將背景設定為白色
AllowUserToAddRows 去除最后一行編輯行
RowHeadersVisible 去除默認的第一列空白列
BackgroudColor 將表格背景設為其他顏色

二、讀取資料很簡單 DataSource 可以接受 DataTable 或者 List 等資料格式
一般我們每行資料后面會有一個操作列,那么在使用操作列時,這里提供兩種方法,一種使用代碼添加,一種使用表格屬性添加
第一種,表格屬性添加,保存后,就會出現一個操作列,按鈕的顯示文本一定要在 DefaultCellStyle 中設定,然后打開 GridView 的屬性,添加 CellContentClick 事件,給按鈕一個事件
1 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 2 { 3 if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Column10") 4 { 5 //獲取當前資料 ID 6 int id = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells[1].Value); 7 8 MessageBox.Show($"當前資料ID:{id}"); 9 } 10 }
第二種,使用代碼添加按鈕,添加完成后,同樣也要給一個事件,事件的方法同第一種一樣,這里就不重復貼代碼了
1 dataGridView2.DataSource = dt; 2 3 //創建按鈕 4 DataGridViewButtonColumn btnOpenFile = new DataGridViewButtonColumn(); 5 btnOpenFile.Name = "SelectDetail"; 6 btnOpenFile.HeaderText = "查看詳情"; 7 btnOpenFile.DefaultCellStyle.NullValue = https://www.cnblogs.com/liuchenxing/archive/2022/04/21/"查看詳情"; 8 dataGridView2.Columns.Add(btnOpenFile); 9 10 //加載按鈕點擊事件 11 dataGridView2.CellContentClick += DataGridView2_CellContentClick;
那么我們開始為什么加一個 tabControl 的控制元件呢?這里是為了演示一個問題,我們在切換兩個 tab 的時候,實際上時每次都去讀取資料并顯示,那么就會出現一個問題,使用代碼添加的按鈕,會重復出現多次按鈕,因為每次加載時都會創建按鈕(有可能有解決方案,但是我這里沒查到,歡迎評論留言解決方案),而使用表格屬性添加的按鈕則不會,

我們這里在加個常用功能,增加 CheckBox 選擇資料并洗掉
這里只需要增加一個 CheckBox 型別的列就行了

選擇資料后點擊洗掉按鈕
private void button1_Click(object sender, EventArgs e) { int count = 0; //獲取選擇資料的條數 for (int i = 0; i < this.dataGridView1.RowCount; i++) { if (this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString() == "TRUE") { count++; } } if (count == 0) { MessageBox.Show("請選擇資料"); return; } else { //定義泛型list IList list = null; List<FileData> list1 = new List<FileData>(); for (int i = 0; i < this.dataGridView1.RowCount; i++) { if (this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString() == "TRUE") { //賦值給泛型list list = (IList)this.dataGridView1.DataSource; //將資料從泛型list洗掉 list.RemoveAt(this.dataGridView1.CurrentRow.Index); } } //遍歷泛型Gridview資料 foreach (var item in list)
{
//var obj = new { ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }; System.Type types = item.GetType(); string path = (string)types.GetProperty("Path").GetValue(item, null); double size = (double)types.GetProperty("Size").GetValue(item, null); string type = (string)types.GetProperty("Type").GetValue(item, null); string name = (string)types.GetProperty("Name").GetValue(item, null); //添加至新的list里 list1.Add(new FileData() { Size = size, Path = path, Type = type, Name = name }); } //將新的list內容賦值給舊的物件 listFile = list1; //this.dataGridView1.DataSource = null; //重新給gridview賦值,不可清空gridview在賦值,會出現格式資料被清除 this.dataGridView1.DataSource = listFile.Select(group => new { Size = group.Size, Path = group.Path, Type = group.Type, Name = group.Name }).ToList(); } }
我這里的做法是,將 DataSource 直接賦值給一個泛型的List物件,然后通過這個泛型List洗掉 資料,最后將泛型List轉為對應的顯示資料物件,如果不轉成對應的物件,就會出現列頭的直接顯示為你的資料庫表欄位名
下面是全選,反選的方法
/// <summary> /// 全選 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button5_Click(object sender, EventArgs e) { for (int i = 0; i < this.dataGridView1.Rows.Count; i++) { this.dataGridView1.Rows[i].Cells[0].Value = https://www.cnblogs.com/liuchenxing/archive/2022/04/21/"TRUE"; } } /// <summary> /// 反選 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button6_Click(object sender, EventArgs e) { for (int i = 0; i < this.dataGridView1.Rows.Count; i++) { if (Convert.ToString(this.dataGridView1.Rows[i].Cells[0].Value) == "TRUE") this.dataGridView1.Rows[i].Cells[0].Value = https://www.cnblogs.com/liuchenxing/archive/2022/04/21/"FALSE"; else this.dataGridView1.Rows[i].Cells[0].Value = https://www.cnblogs.com/liuchenxing/archive/2022/04/21/"TRUE"; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/460725.html
標籤:.NET技术
