它是 C# WinForm 中用于数据展示、编辑、交互的核心控件,支持多种数据绑定方式、样式自定义和用户操作处理,下面从核心功能到实战细节逐一讲解。
一、核心前提:控件添加 1. 可视化添加(推荐,WinForm 项目
C打开 Visual Studio 窗体设计器,从「工具箱」的「数据」分类中找到 DataGridView,拖拽到窗体上,可通过鼠标调整大小和位置。
2. 代码动态添加 在窗体的 Load 事件或自定义方法中编写代码,手动创建并添加控件:
using System.Windows.Forms; private void Form1_Load ( object sender, EventArgs e ) { // 创建 DataGridView 实例 DataGridView dgv = new DataGridView(); // 设置控件属性 dgv.Dock = DockStyle.Fill; // 填充整个窗体 dgv.Name = "dgvStudent" ; dgv.TabIndex = 0 ; // 添加到窗体控件集合 this .Controls.Add(dgv); }
二、数据绑定(核心功能) DataGridView 支持两种核心数据绑定方式,其中数据绑定(非手动添加列 / 行)是项目开发中的主流方式,效率更高、可维护性更强。
方式 1:绑定到自定义实体类集合(最常用,业务开发首选) 适合展示结构化业务数据(如学生、订单、商品等),步骤清晰且易扩展。
// 学生实体类 public class Student { public int Id { get ; set ; } // 学生ID public string Name { get ; set ; } // 学生姓名 public int Age { get ; set ; } // 学生年龄 public string ClassName { get ; set ; } // 所在班级 }
• 第二步:构建实体集合并绑定到 DataSource 属性 private void BindDataToDgv () { // 1. 构建实体类集合(实际项目中可从数据库、接口获取) List<Student> studentList = new List<Student>() { new Student(){ Id= 1 , Name= "张三" , Age= 18 , ClassName= "高一(1)班" }, new Student(){ Id= 2 , Name= "李四" , Age= 17 , ClassName= "高一(2)班" }, new Student(){ Id= 3 , Name= "王五" , Age= 18 , ClassName= "高一(1)班" } }; // 2. 核心:绑定到 DataGridView 的 DataSource 属性 dgvStudent.DataSource = studentList; // dgvStudent 是窗体上的 DataGridView 控件名 }
• 调用绑定方法:在窗体 Load 事件中执行 BindDataToDgv();,运行后即可自动生成列并展示数据。 方式 2:绑定到 DataTable(灵活,适合动态数据结构) 适合数据列不固定、需要动态构建表格结构的场景(如导出报表、动态查询结果展示)。 private void BindDataTableToDgv () { // 1. 创建 DataTable 并定义列结构 DataTable dt = new DataTable( "StudentTable" ); dt.Columns.Add( "Id" , typeof ( int )); // 列名+数据类型 dt.Columns.Add( "Name" , typeof ( string )); dt.Columns.Add( "Age" , typeof ( int )); dt.Columns.Add( "ClassName" , typeof ( string )); // 2. 添加行数据 dt.Rows.Add( 1 , "张三" , 18 , "高一(1)班" ); dt.Rows.Add( 2 , "李四" , 17 , "高一(2)班" ); dt.Rows.Add( 3 , "王五" , 18 , "高一(1)班" ); // 3. 核心:绑定到 DataSource dgvStudent.DataSource = dt; }
补充:手动添加列和行(非绑定模式,适合简单静态数据) 无需数据源,直接手动构建表格内容,灵活性低,仅适合少量静态数据展示。
private void AddColumnAndRowManually () { // 1. 手动添加列(设置列名、表头文本) dgvStudent.Columns.Add( "IdColumn" , "学生ID" ); dgvStudent.Columns.Add( "NameColumn" , "学生姓名" ); dgvStudent.Columns.Add( "AgeColumn" , "年龄" ); // 2. 手动添加行(两种方式) // 方式A:直接添加值数组 dgvStudent.Rows.Add( 1 , "张三" , 18 ); // 方式B:创建行对象再添加 DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dgvStudent); // 绑定列结构 row.Cells[ 0 ].Value = 2 ; row.Cells[ 1 ].Value = "李四" ; row.Cells[ 2 ].Value = 17 ; dgvStudent.Rows.Add(row); }
三、关键属性配置(优化展示和交互) 1. 外观配置
// 表格样式 dgvStudent.GridColor = Color.LightGray; // 网格线颜色 dgvStudent.BackgroundColor = Color.White; // 背景色 dgvStudent.BorderStyle = BorderStyle.FixedSingle; // 边框样式 // 列配置 dgvStudent.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // 列自动适应内容 dgvStudent.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // 表头居中 dgvStudent.ColumnHeadersHeight = 35 ; // 表头高度 // 行配置 dgvStudent.RowHeadersVisible = false ; // 隐藏行头(左侧序号列) dgvStudent.RowsDefaultCellStyle.Height = 30 ; // 行高 dgvStudent.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb( 245 , 245 , 245 ); // 隔行变色(优化可读性)
2. 交互配置
dgvStudent.ReadOnly = false ; // 是否只读(true:禁止编辑单元格) dgvStudent.AllowUserToAddRows = false ; // 禁止用户手动添加行(绑定模式下常用,避免末尾空行) dgvStudent.AllowUserToDeleteRows = false ; // 禁止用户手动删除行 dgvStudent.AllowUserToResizeColumns = true ; // 允许用户调整列宽 dgvStudent.MultiSelect = false ; // 禁止多行选择(默认true) dgvStudent.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 选择模式:整行选择(常用)
四、获取选中行 / 单元格数据(常用交互操作) 开发中常需要获取用户选中的数据进行后续处理(如修改、删除),核心是通过 SelectedRows 或 CurrentCell 实现。 1. 获取选中整行数据(推荐,整行选择模式下)
// 示例:按钮点击事件中获取选中行 private void btnGetSelectedRow_Click ( object sender, EventArgs e ) { // 判断是否选中了行 if (dgvStudent.SelectedRows.Count > 0 ) { // 获取第一行选中数据(MultiSelect=false 时仅一行) DataGridViewRow selectedRow = dgvStudent.SelectedRows[ 0 ]; // 方式A:通过列索引获取(需记住列顺序,不推荐) int id = Convert.ToInt32(selectedRow.Cells[ 0 ].Value); string name = selectedRow.Cells[ 1 ].Value.ToString(); // 方式B:通过列名获取(推荐,与列顺序无关,更稳定) // 绑定实体/DataTable 时,列名对应实体属性名/DataTable 列名;手动添加列对应列的 Name 属性 int id2 = Convert.ToInt32(selectedRow.Cells[ "Id" ].Value); // 绑定模式 // int id2 = Convert.ToInt32(selectedRow.Cells["IdColumn"].Value); // 手动添加列模式 string name2 = selectedRow.Cells[ "Name" ].Value.ToString(); // 弹窗展示结果 MessageBox.Show( $"选中学生:ID= {id2} ,姓名= {name2} " ); } else { MessageBox.Show( "请先选中一行数据!" ); } }
2. 获取单个单元格数据
private void dgvStudent_CellClick ( object sender, DataGridViewCellEventArgs e ) { // 排除表头(行索引≥0,列索引≥0) if (e.RowIndex >= 0 && e.ColumnIndex >= 0 ) { object cellValue = dgvStudent.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; string content = cellValue == null ? "" : cellValue.ToString(); MessageBox.Show( $"选中单元格内容: {content} " ); } }
五、常用事件(处理用户操作) DataGridView 提供了丰富的事件,用于响应用户的编辑、点击、选择等操作,以下是最常用的 3 个事件。 1. CellClick 事件:单元格点击事件
• 响应用户点击任意单元格的操作,上文已演示,可用于获取单元格数据、触发详情展示等。 2. CellValueChanged 事件:单元格值改变事件 当单元格内容被修改并失去焦点时触发(仅 ReadOnly=false 时有效),用于监听数据编辑操作。 private void dgvStudent_CellValueChanged ( object sender, DataGridViewCellEventArgs e ) { if (e.RowIndex >= 0 && e.ColumnIndex >= 0 ) { DataGridViewRow changedRow = dgvStudent.Rows[e.RowIndex]; string studentName = changedRow.Cells[ "Name" ].Value.ToString(); string changedColumn = dgvStudent.Columns[e.ColumnIndex].HeaderText; object newValue = changedRow.Cells[e.ColumnIndex].Value; MessageBox.Show( $"学生「 {studentName} 」的「 {changedColumn} 」已修改为: {newValue} " ); } }
3. RowHeaderMouseClick 事件:行头点击事件 响应用户点击左侧行头的操作,常用于快速选中整行或触发行相关操作。
private void dgvStudent_RowHeaderMouseClick ( object sender, DataGridViewCellMouseEventArgs e ) { if (e.RowIndex >= 0 ) { dgvStudent.Rows[e.RowIndex].Selected = true ; // 选中当前行 string tip = $"已选中第 {e.RowIndex + 1 } 行数据" ; lblTip.Text = tip; // 显示到窗体标签上 } }
六、高级功能:数据筛选与刷新 1. 数据筛选(绑定模式下) 绑定 List 或 DataTable 后,无需重新构建表格,只需筛选数据源再重新绑定即可。
// 示例:筛选年龄=18的学生 private void btnFilter_Click ( object sender, EventArgs e ) { // 1. 获取原始数据源(需保留原始集合,避免筛选后丢失数据) List<Student> originalList = new List<Student>() { new Student(){ Id= 1 , Name= "张三" , Age= 18 , ClassName= "高一(1)班" }, new Student(){ Id= 2 , Name= "李四" , Age= 17 , ClassName= "高一(2)班" }, new Student(){ Id= 3 , Name= "王五" , Age= 18 , ClassName= "高一(1)班" } }; // 2. LINQ 筛选数据 var filteredList = originalList.Where(s => s.Age == 18 ).ToList(); // 3. 重新绑定(刷新表格) dgvStudent.DataSource = null ; // 先清空绑定(避免数据残留) dgvStudent.DataSource = filteredList; }
2. 数据刷新(新增 / 修改 / 删除后) 当数据源发生变化(如新增学生、修改信息),只需重新给 DataSource 赋值即可刷新表格:
// 示例:新增学生后刷新表格 private void btnAddStudent_Click ( object sender, EventArgs e ) { // 1. 假设已获取原始数据源(实际项目中可从全局集合/数据库获取) List<Student> studentList = (List<Student>)dgvStudent.DataSource; if (studentList == null ) studentList = new List<Student>(); // 2. 新增数据 studentList.Add( new Student(){ Id= 4 , Name= "赵六" , Age= 17 , ClassName= "高一(2)班" }); // 3. 刷新表格(重新绑定) dgvStudent.DataSource = null ; dgvStudent.DataSource = studentList; }
七、总结 1、 DataGridView 核心是数据绑定,推荐优先使用「实体类集合」或「DataTable」绑定,效率远高于手动添加列 / 行。 2、关键操作:通过 DataSource 绑定数据、通过 SelectedRows 获取选中数据、通过重新绑定实现数据刷新。 3、优化体验:合理配置外观和交互属性(隔行变色、整行选择、禁止空行),使用常用事件响应用户操作。 4、适用场景:WinForm 项目中所有结构化数据的展示、编辑、筛选需求,是桌面开发中数据交互的核心控件。
阅读原文:原文链接
该文章在 2026/1/19 10:43:02 编辑过