C# DataGridView 实用操作指南

码头散步
码头散步
发布时间:2026-10-14 | 1人浏览过
原创

掌握C#中DataGridView的高级应用,包括数据源绑定、列布局定制、内容格式化、数据验证及虚拟模式优化,满足复杂界面交互与大数据量展示需求。

数据获取与基础绑定

在操作DataGridView前,准确读取当前选中的行数据并绑定正确的数据源是基础步骤。

第1步:获取当前行单元格内容

目的:获取用户当前选定行中特定列的值。

操作:

  1. 通过 BindingContext 获取当前数据绑定位置。
  2. 访问 DataSource 对应的 Table 和指定 Row/Column 索引。
  3. 使用 .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步:绑定对象数据

目的:将自定义对象列表直接展示在表格中。

操作:

  1. 创建对象集合(如 List<YourClass>)。
  2. 赋值给 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步:动态调整列的可见性与顺序

目的:隐藏无用列或自定义列的排列逻辑。

操作:

  1. 通过 Visible = false 隐藏列。
  2. 通过修改 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步:在列中显示图像

目的:添加状态图标或动作按钮图标。

操作:

  1. 实例化 DataGridViewImageColumn。
  2. 加载图片资源。
  3. 插入到指定位置。
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)

目的:当数据量极大(数万行以上)时,避免一次性加载导致内存溢出或卡顿。

操作:

  1. 开启 dataGridView1.VirtualMode = true。
  2. 订阅 CellValueNeeded 事件,按需绘制单元格内容。
  3. 实现数据源的缓存或分页加载逻辑。

参考文档:Implement Virtual Mode in the Windows Forms DataGridView Control。

第16步:自定义列宽(扩展类)

目的:创建完全自定义的单元格渲染逻辑。

步骤:

  1. 继承 DataGridViewTextBoxCell 创建新 Cell 类。
  2. 继承 DataGridViewColumn 创建新 Column 类,指定 CellTemplate。
  3. 将新 Column 添加到 Grid 中。

第17步:锁定列只读

// 禁止编辑特定列
dataGridView1.Columns["CompanyName"].ReadOnly = true;

第18步:绑定并显示对象的高级用法

除了简单的 List 绑定,还可以绑定包含复杂属性的对象。确保对象属性为 Public,并且具备无参构造函数以便 DataGridView 正确反射。

以上就是C# DataGridView常用操作的详细内容,更多关于C# WinForms控件开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表