本文将详细讲解C# Winform中DataGridView控件的基础应用,通过实际代码示例帮助开发者快速掌握DataGridView的使用技巧。
什么是DataGridView?
DataGridView是Windows窗体应用程序中最常用的数据展示控件,它可以以表格形式灵活地显示和编辑数据。主要由行(Rows)、列(Columns)和单元格(Cells)组成。
DataGridView基本使用
创建DataGridView控件
// 在Form设计器中添加DataGridView控件  
private DataGridView dataGridView1;  
// 代码初始化方式  
private void InitializeDataGridView()  
{  
    dataGridView1 = new DataGridView();  
    this.Controls.Add(dataGridView1);  
    dataGridView1.Dock = DockStyle.Fill; // 填充整个窗体  
}  
手动添加列和数据
private void PopulateDataGridView()  
{  
    // 添加列  
    dataGridView1.Columns.Add("ID", "编号");  
    dataGridView1.Columns.Add("Name", "姓名");  
    dataGridView1.Columns.Add("Age", "年龄");  
    // 添加数据行  
    dataGridView1.Rows.Add(1, "张三", 25);  
    dataGridView1.Rows.Add(2, "李四", 30);  
}  
数据绑定
// 使用数据集绑定  
private void BindDataGridView()  
{  
    // 假设有一个DataTable类型的数据源  
    DataTable dt = GetDataFromDatabase();  
    dataGridView1.DataSource = dt;  
}  
完整例子
using System.Data;
namespace AppDataGrid
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeDataGridView();
            //PopulateDataGridView();// 手动添加列和数据
            BindDataGridView();// 使用数据集绑定,这个常用一些
        }
        // 代码初始化方式  
        private void InitializeDataGridView()
        {
            dataGridView1.Dock = DockStyle.Fill; // 填充整个窗体  
            // 设置一些常用属性  
            dataGridView1.AllowUserToAddRows = false; // 不允许用户添加行
            dataGridView1.AllowUserToDeleteRows = false; // 不允许用户删除行
            dataGridView1.ReadOnly = true; // 禁用编辑功能
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 自动调整列宽度以填充整个DataGridView
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 选择整行
        }
        // 手动添加列和数据  
        private void PopulateDataGridView()
        {
            // 添加列  
            dataGridView1.Columns.Add("ID", "编号");
            dataGridView1.Columns.Add("Name", "姓名");
            dataGridView1.Columns.Add("Age", "年龄");
            // 添加数据行  
            dataGridView1.Rows.Add(1, "张三", 25);
            dataGridView1.Rows.Add(2, "李四", 30);
            dataGridView1.Rows.Add(3, "王五", 28);
            dataGridView1.Rows.Add(4, "赵六", 35);
        }
        // 使用数据集绑定  
        private void BindDataGridView()
        {
            // 假设有一个DataTable类型的数据源  
            DataTable dt = GetDataFromDatabase();
            dataGridView1.DataSource = dt;
            // 可以在绑定后设置列标题  
            if (dataGridView1.Columns.Count >= 3)
            {
                dataGridView1.Columns[0].HeaderText = "编号";
                dataGridView1.Columns[1].HeaderText = "姓名";
                dataGridView1.Columns[2].HeaderText = "年龄";
            }
        }
        // 模拟从数据库获取数据  
        private DataTable GetDataFromDatabase()
        {
            // 创建一个新的DataTable  
            DataTable dt = new DataTable();
            // 添加列  
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Age", typeof(int));
            // 添加数据行  
            dt.Rows.Add(1, "张三", 25);
            dt.Rows.Add(2, "李四", 30);
            dt.Rows.Add(3, "王五", 28);
            dt.Rows.Add(4, "赵六", 35);
            dt.Rows.Add(5, "小明", 22);
            return dt;
        }
    }
}

常用属性与事件
属性设置
// 设置DataGridView外观  
dataGridView1.AllowUserToAddRows = false; // 禁止用户添加行  
dataGridView1.ReadOnly = true; // 设置为只读  
dataGridView1.MultiSelect = false; // 禁止多选  
事件处理
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)  
{  
    // 单击单元格事件  
    if(e.RowIndex >= 0)  
    {  
        string cellValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();  
        MessageBox.Show($"您点击了:{cellValue}");  
    }  
}  
高级功能
自定义列类型
// 创建复选框列  
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();  
checkColumn.HeaderText = "选择";  
dataGridView1.Columns.Add(checkColumn);  
格式化显示
// 设置日期列格式  
dataGridView1.Columns["DateColumn"].DefaultCellStyle.Format = "yyyy-MM-dd";  
完整例子
using System.Data;
namespace AppDataGrid
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeDataGridView();
            PopulateDataGridView();// 手动添加列和数据
            //BindDataGridView();// 使用数据集绑定,这个常用一些
            AddAdvancedFeatures();
            // 注册事件处理器  
            dataGridView1.CellClick += DataGridView_CellClick;
        }
        // 代码初始化方式  
        private void InitializeDataGridView()
        {
            dataGridView1.Dock = DockStyle.Fill; // 填充整个窗体  
            // 设置一些常用属性  
            dataGridView1.AllowUserToAddRows = false; // 不允许用户添加行
            dataGridView1.AllowUserToDeleteRows = false; // 不允许用户删除行
            dataGridView1.ReadOnly = true; // 禁用编辑功能
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 自动调整列宽度以填充整个DataGridView
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 选择整行
        }
        // 手动添加列和数据  
        private void PopulateDataGridView()
        {
            // 添加列  
            dataGridView1.Columns.Add("ID", "编号");
            dataGridView1.Columns.Add("Name", "姓名");
            dataGridView1.Columns.Add("Age", "年龄");
            // 添加日期列  
            dataGridView1.Columns.Add("DateColumn", "日期");
            // 添加复选框列  
            DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
            checkColumn.HeaderText = "选择";
            checkColumn.Name = "SelectColumn";
            dataGridView1.Columns.Add(checkColumn);
            // 添加数据行  
            dataGridView1.Rows.Add(1, "张三", 25, DateTime.Now.AddDays(-10), true);
            dataGridView1.Rows.Add(2, "李四", 30, DateTime.Now.AddDays(-5), false);
            dataGridView1.Rows.Add(3, "王五", 28, DateTime.Now, true);
            dataGridView1.Rows.Add(4, "赵六", 35, DateTime.Now.AddDays(5), false);
            // 设置日期列格式  
            dataGridView1.Columns["DateColumn"].DefaultCellStyle.Format = "yyyy-MM-dd";
        }  
        // 使用数据集绑定  
        private void BindDataGridView()
        {
            // 假设有一个DataTable类型的数据源  
            DataTable dt = GetDataFromDatabase();
            dataGridView1.DataSource = dt;
            // 可以在绑定后设置列标题  
            if (dataGridView1.Columns.Count >= 4)
            {
                dataGridView1.Columns[0].HeaderText = "编号";
                dataGridView1.Columns[1].HeaderText = "姓名";
                dataGridView1.Columns[2].HeaderText = "年龄";
                dataGridView1.Columns[3].HeaderText = "日期";
                // 设置日期列格式  
                dataGridView1.Columns[3].DefaultCellStyle.Format = "yyyy-MM-dd";
            }
            // 添加复选框列  
            AddCheckBoxColumn();
        }
        // 添加复选框列  
        private void AddCheckBoxColumn()
        {
            DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
            checkColumn.HeaderText = "选择";
            checkColumn.Name = "SelectColumn";
            dataGridView1.Columns.Add(checkColumn);
            // 为所有行的复选框列设置默认值  
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                row.Cells["SelectColumn"].Value = false;
            }
        }
        // 添加高级功能  
        private void AddAdvancedFeatures()
        {
            // 设置交替行颜色  
            dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.LightGray;
            // 设置行头的样式  
            dataGridView1.RowHeadersWidth = 50;
            // 设置单元格数据类型验证  
            dataGridView1.Columns["Age"].ValueType = typeof(int);
            // 冻结第一列  
            if (dataGridView1.Columns.Count > 0)
            {
                dataGridView1.Columns[0].Frozen = true;
            }
        }
        // 单元格点击事件处理  
        private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // 单击单元格事件  
            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
            {
                // 检查单元格值是否为空  
                if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
                {
                    string cellValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    MessageBox.Show($"您点击了:{cellValue}");
                }
                else
                {
                    MessageBox.Show($"您点击了空单元格,位置: [{e.RowIndex}, {e.ColumnIndex}]");
                }
            }
        }
        // 模拟从数据库获取数据  
        private DataTable GetDataFromDatabase()
        {
            // 创建一个新的DataTable  
            DataTable dt = new DataTable();
            // 添加列  
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Age", typeof(int));
            dt.Columns.Add("DateColumn", typeof(DateTime));
            // 添加数据行  
            dt.Rows.Add(1, "张三", 25, DateTime.Now.AddDays(-10));
            dt.Rows.Add(2, "李四", 30, DateTime.Now.AddDays(-5));
            dt.Rows.Add(3, "王五", 28, DateTime.Now);
            dt.Rows.Add(4, "赵六", 35, DateTime.Now.AddDays(5));
            dt.Rows.Add(5, "小明", 22, DateTime.Now.AddDays(10));
            return dt;
        }
    }
}

性能优化建议
- 对于大数据量,建议使用虚拟模式  
 - 避免在单元格绘制事件中执行复杂操作  
 - 使用数据绑定而非逐行添加  
 
结语
DataGridView是Winform中强大的数据展示控件,通过合理使用,可以快速构建专业的数据管理界面。
阅读原文:原文链接
该文章在 2025/6/2 13:13:48 编辑过