在用 winform 的時候,我們操作表格數據一般使用 GridView 會比較多,這裡我總結下我在使用的過程中遇到的一些問題 一、首先創建窗體和表格,將表格簡單設置一下,去除最後一行編輯行,去除預設的第一列空白列,將背景設置為白色 AllowUserToAddRows 去除最後一行編輯行 RowH ...
在用 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 = "查看詳情"; 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 = "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 = "FALSE"; else this.dataGridView1.Rows[i].Cells[0].Value = "TRUE"; } }