LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# DataGridView 控件使用详解

admin
2026年1月18日 21:0 本文热度 31

它是 C# WinForm 中用于数据展示、编辑、交互的核心控件,支持多种数据绑定方式、样式自定义和用户操作处理,下面从核心功能到实战细节逐一讲解。

一、核心前提:控件添加

 1. 可视化添加(推荐,WinForm 项目

C打开 Visual Studio 窗体设计器,从「工具箱」的「数据」分类中找到 DataGridView,拖拽到窗体上,可通过鼠标调整大小和位置。

 2. 代码动态添加
在窗体的 Load 事件或自定义方法中编写代码,手动创建并添加控件:



1
2
3
4
5
6
7
8
9
10
11
12
13

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:绑定到自定义实体类集合(最常用,业务开发首选)
适合展示结构化业务数据(如学生、订单、商品等),步骤清晰且易扩展。

  • • 第一步:定义自定义实体类(示例:学生类)


1
2
3
4
5
6
7
8

// 学生实体类
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 属性


1
2
3
4
5
6
7
8
9
10
11
12
13

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(灵活,适合动态数据结构)
    适合数据列不固定、需要动态构建表格结构的场景(如导出报表、动态查询结果展示)。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

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;
}



 补充:手动添加列和行(非绑定模式,适合简单静态数据)
无需数据源,直接手动构建表格内容,灵活性低,仅适合少量静态数据展示。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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. 外观配置



1
2
3
4
5
6
7
8
9
10
11
12
13
14

// 表格样式
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. 交互配置



1
2
3
4
5
6

dgvStudent.ReadOnly = false; // 是否只读(true:禁止编辑单元格)
dgvStudent.AllowUserToAddRows = false; // 禁止用户手动添加行(绑定模式下常用,避免末尾空行)
dgvStudent.AllowUserToDeleteRows = false; // 禁止用户手动删除行
dgvStudent.AllowUserToResizeColumns = true; // 允许用户调整列宽
dgvStudent.MultiSelect = false; // 禁止多行选择(默认true)
dgvStudent.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 选择模式:整行选择(常用)



四、获取选中行 / 单元格数据(常用交互操作)

开发中常需要获取用户选中的数据进行后续处理(如修改、删除),核心是通过 SelectedRows 或 CurrentCell 实现。
1. 获取选中整行数据(推荐,整行选择模式下)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

// 示例:按钮点击事件中获取选中行
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. 获取单个单元格数据



1
2
3
4
5
6
7
8
9
10

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 时有效),用于监听数据编辑操作。


1
2
3
4
5
6
7
8
9
10
11
12

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 事件:行头点击事件
响应用户点击左侧行头的操作,常用于快速选中整行或触发行相关操作。



1
2
3
4
5
6
7
8
9

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 后,无需重新构建表格,只需筛选数据源再重新绑定即可。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

// 示例:筛选年龄=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 赋值即可刷新表格:



1
2
3
4
5
6
7
8
9
10
11
12
13
14

// 示例:新增学生后刷新表格
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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved