DataGridView 是 Windows Forms 中最強大、彈性最高的資料呈現控制項,但功能豐富也意味著學習曲線較陡峭。本文整理 18 個實務常用技巧,涵蓋資料存取、外觀客製、效能優化、資料驗證等面向,助您快速掌握核心用法。
int pos = dataGridView1.BindingContext[dataGridView1.DataSource, dataGridView1.DataMember].Position;
string value = dataGridView1.Rows[pos].Cells[21].Value?.ToString().Trim();
dataGridView1.Columns[0].Width = 80;
dataGridView1.Columns[1].Width = 180;
// 依標題與顯示列調整所有欄
dataGridView1.AutoSizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// 單一欄/列調整
dataGridView1.AutoSizeColumn(2, DataGridViewAutoSizeColumnMode.HeaderOnly);
dataGridView1.AutoSizeRow(2, DataGridViewAutoSizeRowMode.AllHeaders);
直接指定 DataSource = List<T>,欄位自動對應公開屬性,亦可搭配 AutoGenerateColumns = false 手動定義欄位。
dataGridView1.GridColor = Color.BlueViolet;
dataGridView1.BorderStyle = BorderStyle.Fixed3D;
dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
dataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
dataGridView1.Columns["CustomerID"].Visible = false;
dataGridView1.Columns["ContactName"].DisplayIndex = 0;
dataGridView1.Columns["City"].DisplayIndex = 1;
var imgCol = new DataGridViewImageColumn();
imgCol.Image = new Icon(GetType(), "tree.ico").ToBitmap();
imgCol.Name = "Tree";
imgCol.HeaderText = "Nice tree";
dataGridView1.Columns.Insert(2, imgCol);
dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c"; // 貨幣
dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d"; // 短日期
dataGridView1.DefaultCellStyle.NullValue = "no entry";
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.Columns["CustomerName"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dataGridView1.Columns["AddToCartButton"].Frozen = true; // 該欄及左側欄位固定
使用 SelectedCells、SelectedRows、SelectedColumns 集合,詳細用法請參考 MSDN 文件。
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
if (e.Exception != null && e.Context == DataGridViewDataErrorContext.Commit)
MessageBox.Show("CustomerID 值必須唯一。");
}
設定 VirtualMode = true,並處理 CellValueNeeded、CellValuePushed 事件,僅在需要時載入資料,大幅降低記憶體佔用。
dataGridView1.Columns["CompanyName"].ReadOnly = true;
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dataSet;
dataGridView1.Columns.Remove("Fax"); // 或設 Visible = false
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter; // 進入儲存格即進入編輯
private void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["Region"].Value = "WA";
e.Row.Cells["City"].Value = "Redmond";
e.Row.Cells["PostalCode"].Value = "98052-6399";
e.Row.Cells["Country"].Value = "USA";
}
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "CompanyName")
{
if (string.IsNullOrEmpty(e.FormattedValue?.ToString()))
{
dataGridView1.Rows[e.RowIndex].ErrorText = "Company Name 不可為空";
e.Cancel = true;
}
}
}
DataSet ds = new DataSet("MyDataSet");
ds.Tables[tableName].Rows.Clear();
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) // 排除新列
{
DataRow row = ds.Tables[tableName].NewRow();
for (int j = 0; j < dataGridView1.Columns.Count; j++)
row[j] = dataGridView1.Rows[i].Cells[j].Value?.ToString();
ds.Tables[tableName].Rows.Add(row);
}
繼承 DataGridViewTextBoxCell 建立自訂 Cell,再繼承 DataGridViewColumn 指定 CellTemplate,即可將客製化欄位加入 DataGridView,實現下拉選單、進度條、按鈕等豐富介面元素。
DataGridView 功能極其豐富,掌握上述 18 項技巧已能應付大多數商務應用場景。關鍵在於:善用 AutoSizeColumnsMode 與 VirtualMode 提升效能;透過 DefaultCellStyle 統一格式;利用事件驅動完成驗證與資料同步。實務上建議搭配 BindingSource 管理資料繫結,配合 DataTable 或實體類別集合,構建可維護的資料呈現層。