C# DataGridView 实用操作指南
掌握C#中DataGridView的高级应用,包括数据源绑定、列布局定制、内容格式化、数据验证及虚拟模式优化,满足复杂界面交互与大数据量展示需求。
数据获取与基础绑定
在操作DataGridView前,准确读取当前选中的行数据并绑定正确的数据源是基础步骤。
第1步:获取当前行单元格内容
目的:获取用户当前选定行中特定列的值。
操作:
- 通过
BindingContext获取当前数据绑定位置。 - 访问
DataSource对应的 Table 和指定 Row/Column 索引。 - 使用
.ToString().Trim()安全转换并去除空格。
// 获取当前绑定位置
currentPosition = dataGridView1.BindingContext[
dataGridView1.DataSource, dataGridView1.DataMember].Position;
// 获取第21列(索引20)的内容
bookContent = this.database.dataSet.Tables[0].Rows[currentPosition][21].ToString().Trim();
MessageBox.Show(bookContent);
第2步:绑定对象数据
目的:将自定义对象列表直接展示在表格中。
操作:
- 创建对象集合(如
List<YourClass>)。 - 赋值给
dataGridView1.DataSource。
系统会自动根据对象的公共属性生成对应列。参考官方文档:Bind Objects to Windows Forms DataGridView Controls。
列与行的外观及布局控制
合理的列宽、显示顺序和视觉风格能显著提升用户体验。
第3步:自定义列宽度
目的:固定或调整各列的显示宽度。
操作:
- 直接设置
Columns[i].Width。 - 或者使用自动适应方法。
// 手动设定宽度
this.dataGridView1.Columns[0].Width = 80;
this.dataGridView1.Columns[1].Width = 80;
this.dataGridView1.Columns[2].Width = 180;
// 自动适应列宽(基于表头和已显示的行内容)
DataGridView.AutoSizeColumns(DataGridViewAutoSizeColumnCriteria.HeaderAndDisplayedRows);
// 仅基于表头适应第2列
DataGridView.AutoSizeColumn(DataGridViewAutoSizeColumnCriteria.HeaderOnly, 2, false);
// 自动适应行高
DataGridView.AutoSizeRows(DataGridViewAutoSizeRowCriteria.HeaderAndColumns, 0, dataGridView1.Rows.Count, false);
第4步:动态调整列的可见性与顺序
目的:隐藏无用列或自定义列的排列逻辑。
操作:
- 通过
Visible = false隐藏列。 - 通过修改
DisplayIndex改变列的物理显示顺序。
// 隐藏 Fax 列
customersDataGridView.Columns["Fax"].Visible = false;
// 重新排列显示顺序
customersDataGridView.Columns["ContactName"].DisplayIndex = 0;
customersDataGridView.Columns["ContactTitle"].DisplayIndex = 1;
customersDataGridView.Columns["City"].DisplayIndex = 2;
第5步:设置网格线条风格
目的:美化表格边框颜色及样式。
参数:
GridColor:线条颜色。BorderStyle:整体边框样式(如Fixed3D)。CellBorderStyle:单个单元格边框(设为None可更简洁)。
this.dataGridView1.GridColor = Color.BlueViolet;
this.dataGridView1.BorderStyle = BorderStyle.Fixed3D;
this.dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
自定义单元格与高级功能
针对特定场景,如插入图标、验证数据或处理大数据量,需要更深入的控件定制。
第6步:在列中显示图像
目的:添加状态图标或动作按钮图标。
操作:
- 实例化
DataGridViewImageColumn。 - 加载图片资源。
- 插入到指定位置。
Icon treeIcon = new Icon(this.GetType(), "tree.ico");
DataGridViewImageColumn iconColumn = new DataGridViewImageColumn();
iconColumn.Image = treeIcon.ToBitmap();
iconColumn.Name = "Tree";
iconColumn.HeaderText = "Status";
// 在第3个位置插入
dataGridView1.Columns.Insert(2, iconColumn);
第7步:格式化单元格内容
目的:统一货币、日期格式及对齐方式。
关键属性:
DefaultCellStyle.Format:设置格式字符串(如c货币,d短日期)。DefaultCellStyle.NullValue:空值显示文本。DefaultCellStyle.Alignment:内容对齐(如右对齐)。
this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";
this.dataGridView1.DefaultCellStyle.NullValue = "no entry";
this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewWrapMode.Wrap;
this.dataGridView1.Columns["CustomerName"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
第8步:冻结左侧列
目的:滚动时保持标识列(如名称)固定在左侧。
this.dataGridView1.Columns["AddToCartButton"].Frozen = true;
第9步:自定义选择与编辑行为
目的:限制用户只能整行选中,且进入即编辑。
// 整行选中,不可多选
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.MultiSelect = false;
// 鼠标进入单元格即进入编辑模式
this.dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
第10步:移除自动生成的列
目的:绑定 DataSource 后,清理不希望显示的默认列。
this.dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = customerDataSet;
// 移除不需要的列
this.dataGridView1.Columns.Remove("Fax");
// 或者仅隐藏
this.dataGridView1.Columns["CustomerID"].Visible = false;
数据验证与错误处理
确保存入数据的合法性并及时向用户反馈。
第11步:新行默认值设定
目的:当用户点击“新行”时,自动填充预设数据。
事件:DefaultValuesNeeded
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";
e.Row.Cells["CustomerID"].Value = NewCustomerId();
}
第12步:数据验证与报错
目的:拦截非法输入(如空值),并在界面显示错误提示。
事件:CellValidating
private void dataGridView1_CellValidating(object sender,
DataGridViewCellValidatingEventArgs e) {
// 检查 CompanyName 列
if (dataGridView1.Columns[e.ColumnIndex].Name == "CompanyName") {
if (e.FormattedValue.ToString() == string.Empty) {
dataGridView1.Rows[e.RowIndex].ErrorText = "公司名不能为空";
e.Cancel = true; // 取消焦点转移,强制修正
}
}
}
第13步:提交时的错误捕获
目的:处理数据源层面的异常(如主键冲突)。
事件:DataError
private void dataGridView1_DataError(object sender,
DataGridViewDataErrorEventArgs e) {
if (e.Exception != null && e.Context == DataGridViewDataErrorContext.Commit) {
MessageBox.Show("CustomerID 必须唯一。");
}
}
第14步:数据同步回 DataSet
目的:将界面上的修改或新增数据遍历写入数据库模型中。
注意:通常建议使用 BindingSource 的 EndEdit 方法简化此过程,但在某些场景下需手动遍历。
DataSet ds = new DataSet("MyDataSet");
ds.Tables[tableName.Trim()].Rows.Clear();
try {
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { // -1 排除新行
DataTable dt = ds.Tables[tableName.Trim()];
DataRow myrow = dt.NewRow();
for (int j = 0; j < dataGridView1.Columns.Count; j++) {
if (!dataGridView1.Rows[i].Cells[j].IsReadOnly) {
myrow[j] = Convert.ToString(dataGridView1.Rows[i].Cells[j].Value);
}
}
ds.Tables[tableName.Trim()].Rows.Add(myrow);
}
} catch (Exception ex) {
MessageBox.Show($"输入类型错误或:{ex.Message}");
}
性能优化与高级特性
第15步:大数据量虚拟模式 (Virtual Mode)
目的:当数据量极大(数万行以上)时,避免一次性加载导致内存溢出或卡顿。
操作:
- 开启
dataGridView1.VirtualMode = true。 - 订阅
CellValueNeeded事件,按需绘制单元格内容。 - 实现数据源的缓存或分页加载逻辑。
参考文档:Implement Virtual Mode in the Windows Forms DataGridView Control。
第16步:自定义列宽(扩展类)
目的:创建完全自定义的单元格渲染逻辑。
步骤:
- 继承
DataGridViewTextBoxCell创建新 Cell 类。 - 继承
DataGridViewColumn创建新 Column 类,指定CellTemplate。 - 将新 Column 添加到 Grid 中。
第17步:锁定列只读
// 禁止编辑特定列
dataGridView1.Columns["CompanyName"].ReadOnly = true;
第18步:绑定并显示对象的高级用法
除了简单的 List 绑定,还可以绑定包含复杂属性的对象。确保对象属性为 Public,并且具备无参构造函数以便 DataGridView 正确反射。
以上就是C# DataGridView常用操作的详细内容,更多关于C# WinForms控件开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









