还在为WinForm数据展示发愁?还在被DataGridView的各种属性搞得头晕眼花?作为一个在数据表格开发路上摸爬滚打多年的老程序员,我深知DataGridView这个"看似简单,实则复杂"的控件给无数C#开发者带来的困扰。今天就来和大家分享一套完整的DataGridView实战攻略,从基础绑定到高级应用,让你彻底掌握这个强大的数据展示利器。
本文将通过3个递进式的实战案例,帮你解决数据绑定混乱、编辑功能不生效、数据库集成踩坑等常见问题,让你的WinForm应用秒变专业级!
在开始实战之前,我们先来认识一下DataGridView的几个关键"武器":
C#// 数据源绑定 - 你的数据展示基础
DataSource: 支持DataTable、DataSet、List<T>等多种数据源
// 自动列生成控制 - 避免列显示混乱的关键
AutoGenerateColumns: false // 强烈建议手动控制列
// 用户操作权限控制
ReadOnly: true/false // 是否允许编辑
AllowUserToAddRows: false // 是否允许用户添加行
AllowUserToDeleteRows: false // 是否允许用户删除行
// 选择模式设置
SelectionMode: FullRowSelect // 整行选择,用户体验更好
C#// 列操作三件套
dataGridView.Columns.Add() // 添加列
dataGridView.Columns.Remove() // 移除列
dataGridView.Columns.Clear() // 清空所有列
// 数据刷新
dataGridView.Refresh() // 手动刷新显示
很多初学者在数据绑定时经常遇到"列显示不正确"、"数据对不上号"等问题。这里有一个完整的解决方案:
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppDataGridViewBasic
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}
}
C#namespace AppDataGridViewBasic
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 创建DataGridView实例
DataGridView dataGridView = new DataGridView();
this.Controls.Add(dataGridView);
// 🔥 关键配置:阻止自动生成列
dataGridView.AutoGenerateColumns = false;
dataGridView.AllowUserToAddRows = false;
dataGridView.Dock = DockStyle.Fill;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// 步骤3:手动创建列(避免显示混乱)
CreateColumns(dataGridView);
// 步骤4:绑定数据源
BindData(dataGridView);
}
private void CreateColumns(DataGridView dgv)
{
// 姓名列
var nameColumn = new DataGridViewTextBoxColumn
{
DataPropertyName = "Name", // 🎯 必须与模型属性名一致
HeaderText = "姓名",
AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
};
dgv.Columns.Add(nameColumn);
// 年龄列
var ageColumn = new DataGridViewTextBoxColumn
{
DataPropertyName = "Age",
HeaderText = "年龄",
Width = 80
};
dgv.Columns.Add(ageColumn);
// 城市列
var cityColumn = new DataGridViewTextBoxColumn
{
DataPropertyName = "City",
HeaderText = "城市",
AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
};
dgv.Columns.Add(cityColumn);
}
private void BindData(DataGridView dgv)
{
var people = new List<Person>
{
new Person { Name = "张三", Age = 28, City = "北京" },
new Person { Name = "李四", Age = 35, City = "上海" },
new Person { Name = "王五", Age = 42, City = "广州" }
};
// 🔥 金句:数据绑定一行代码搞定
dgv.DataSource = people;
}
}
}

💡 避坑指南:
单纯展示数据太无聊?让我们给DataGridView加上编辑功能,实现数据的实时更新:
C#using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AppDataGridViewBasic
{
public partial class Form2 : Form
{
// 数据源
private List<Person> people;
public Form2()
{
InitializeComponent();
InitializeForm();
LoadSampleData();
}
private void InitializeForm()
{
// 🔥 开启编辑模式的正确姿势
dataGridView.ReadOnly = false;
// 注册数据变更事件
dataGridView.CellValueChanged += OnCellValueChanged;
// 🎯 关键:确保编辑完成后触发事件
dataGridView.CellEndEdit += OnCellEndEdit;
// 单元格开始编辑事件
dataGridView.CellBeginEdit += OnCellBeginEdit;
// 数据错误处理
dataGridView.DataError += OnDataError;
// 行删除事件
dataGridView.UserDeletingRow += OnUserDeletingRow;
}
private void LoadSampleData()
{
// 🎯 初始化示例数据
people = new List<Person>
{
new Person { Name = "张三", Age = 25, City = "北京", Email = "zhangsan@email.com", CreateDate = DateTime.Now.AddDays(-10) },
new Person { Name = "李四", Age = 30, City = "上海", Email = "lisi@email.com", CreateDate = DateTime.Now.AddDays(-5) },
new Person { Name = "王五", Age = 28, City = "广州", Email = "wangwu@email.com", CreateDate = DateTime.Now.AddDays(-3) },
new Person { Name = "赵六", Age = 35, City = "深圳", Email = "zhaoliu@email.com", CreateDate = DateTime.Now.AddDays(-1) }
};
// 绑定数据源
dataGridView.DataSource = people;
// 🔥 列设置优化
SetupColumns();
}
private void SetupColumns()
{
if (dataGridView.Columns.Count > 0)
{
// 设置列标题
dataGridView.Columns["Name"].HeaderText = "姓名";
dataGridView.Columns["Age"].HeaderText = "年龄";
dataGridView.Columns["City"].HeaderText = "城市";
dataGridView.Columns["Email"].HeaderText = "邮箱";
dataGridView.Columns["CreateDate"].HeaderText = "创建时间";
// 设置列宽比例
dataGridView.Columns["Name"].FillWeight = 20;
dataGridView.Columns["Age"].FillWeight = 15;
dataGridView.Columns["City"].FillWeight = 20;
dataGridView.Columns["Email"].FillWeight = 25;
dataGridView.Columns["CreateDate"].FillWeight = 20;
// 设置创建时间为只读
dataGridView.Columns["CreateDate"].ReadOnly = true;
// 年龄列只允许数字
dataGridView.Columns["Age"].ValueType = typeof(int);
}
}
// 🔥 核心事件处理方法
private void OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return; // 避免标题行触发事件
var dgv = sender as DataGridView;
if (dgv.DataSource is List<Person> people && e.RowIndex < people.Count)
{
// 获取被修改的对象
Person updatedPerson = people[e.RowIndex];
// 🔥 实战应用:这里可以调用业务逻辑
SavePersonToDatabase(updatedPerson);
// 更新状态栏或给用户反馈
this.Text = $"可编辑数据表格 - 已更新:{updatedPerson.Name} 的信息 [{DateTime.Now:HH:mm:ss}]";
}
}
private void OnCellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// 确保数据验证和格式化
var dgv = sender as DataGridView;
var cell = dgv[e.ColumnIndex, e.RowIndex];
string columnName = dgv.Columns[e.ColumnIndex].Name;
switch (columnName)
{
case "Age":
// 年龄列数据验证
if (!int.TryParse(cell.Value?.ToString(), out int age) || age < 0 || age > 150)
{
MessageBox.Show("请输入有效的年龄(0-150)!", "数据验证", MessageBoxButtons.OK, MessageBoxIcon.Warning);
cell.Value = 0; // 设置默认值
}
break;
case "Email":
// 邮箱格式验证
string email = cell.Value?.ToString();
if (!string.IsNullOrEmpty(email) && !IsValidEmail(email))
{
MessageBox.Show("请输入有效的邮箱格式!", "数据验证", MessageBoxButtons.OK, MessageBoxIcon.Warning);
cell.Value = ""; // 清空无效邮箱
}
break;
case "Name":
// 姓名不能为空
if (string.IsNullOrWhiteSpace(cell.Value?.ToString()))
{
MessageBox.Show("姓名不能为空!", "数据验证", MessageBoxButtons.OK, MessageBoxIcon.Warning);
cell.Value = "未命名";
}
break;
}
}
private void OnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
// 可以在这里添加编辑前的逻辑
var dgv = sender as DataGridView;
string columnName = dgv.Columns[e.ColumnIndex].Name;
// 例如:某些条件下禁止编辑
if (columnName == "CreateDate")
{
e.Cancel = true; // 取消编辑
MessageBox.Show("创建时间不可编辑!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void OnDataError(object sender, DataGridViewDataErrorEventArgs e)
{
// 处理数据类型转换错误等
MessageBox.Show($"数据错误:{e.Exception.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
}
private void OnUserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
// 删除行前的确认
if (MessageBox.Show("确定要删除这条记录吗?", "确认删除",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
e.Cancel = true; // 取消删除
}
}
// 🎯 收藏级代码模板:数据保存方法
private void SavePersonToDatabase(Person person)
{
try
{
// 这里实现你的数据保存逻辑
// 可以是数据库更新、API调用等
Console.WriteLine($"保存数据:{person.Name}, {person.Age}, {person.City}, {person.Email}");
// 模拟异步保存
Task.Run(() => {
System.Threading.Thread.Sleep(100); // 模拟网络延迟
// 实际保存到数据库的代码
});
}
catch (Exception ex)
{
MessageBox.Show($"保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// 🔥 按钮事件处理
private void BtnAdd_Click(object sender, EventArgs e)
{
// 添加新记录
people.Add(new Person
{
Name = "新用户",
Age = 20,
City = "北京",
Email = "new@email.com",
CreateDate = DateTime.Now
});
// 刷新数据源
RefreshDataSource();
}
private void BtnDelete_Click(object sender, EventArgs e)
{
// 删除选中行
if (dataGridView.SelectedRows.Count > 0)
{
var selectedIndex = dataGridView.SelectedRows[0].Index;
if (selectedIndex < people.Count)
{
if (MessageBox.Show("确定要删除选中的记录吗?", "确认删除",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
people.RemoveAt(selectedIndex);
RefreshDataSource();
}
}
}
else
{
MessageBox.Show("请先选择要删除的行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void BtnSaveAll_Click(object sender, EventArgs e)
{
// 保存所有数据
try
{
foreach (var person in people)
{
SavePersonToDatabase(person);
}
MessageBox.Show($"成功保存 {people.Count} 条记录!", "保存成功",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"批量保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// 🔥 辅助方法
private void RefreshDataSource()
{
dataGridView.DataSource = null;
dataGridView.DataSource = people;
SetupColumns();
}
private bool IsValidEmail(string email)
{
try
{
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch
{
return false;
}
}
private void Button_MouseEnter(object sender, EventArgs e)
{
if (sender is Button btn)
{
btn.FlatAppearance.BorderSize = 1;
btn.FlatAppearance.BorderColor = System.Drawing.Color.White;
}
}
private void Button_MouseLeave(object sender, EventArgs e)
{
if (sender is Button btn)
{
btn.FlatAppearance.BorderSize = 0;
}
}
// 🎯 窗体关闭时的清理工作
protected override void OnFormClosed(FormClosedEventArgs e)
{
// 取消事件订阅,避免内存泄漏
if (dataGridView != null)
{
dataGridView.CellValueChanged -= OnCellValueChanged;
dataGridView.CellEndEdit -= OnCellEndEdit;
dataGridView.CellBeginEdit -= OnCellBeginEdit;
dataGridView.DataError -= OnDataError;
dataGridView.UserDeletingRow -= OnUserDeletingRow;
}
base.OnFormClosed(e);
}
}
}

💡 编辑模式最佳实践:
真实项目中,数据往往来自数据库。下面展示如何实现DataGridView与数据库的完美集成:
C#using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
namespace AppDataGridViewBasic
{
public partial class Form3 : Form
{
private DatabaseDataGridManager databaseManager;
private readonly string connectionString = "Server=.;Database=dbtest;Integrated Security=true;";
public Form3()
{
InitializeComponent();
}
private void InitializeForm()
{
try
{
// 初始化数据库管理器
databaseManager = new DatabaseDataGridManager(connectionString, dataGridView);
// 加载数据
databaseManager.LoadDataFromDatabase();
// 更新状态
toolStripStatusLabel.Text = "✅ 数据库连接成功,数据已加载";
}
catch (Exception ex)
{
MessageBox.Show($"初始化失败:{ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
toolStripStatusLabel.Text = "❌ 数据库连接失败";
}
}
// 🔥 按钮事件处理
private void BtnRefresh_Click(object sender, EventArgs e)
{
try
{
databaseManager?.LoadDataFromDatabase();
toolStripStatusLabel.Text = $"🔄 数据已刷新 - {DateTime.Now:HH:mm:ss}";
}
catch (Exception ex)
{
MessageBox.Show($"刷新失败:{ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnAddNew_Click(object sender, EventArgs e)
{
try
{
databaseManager?.AddNewRecord();
toolStripStatusLabel.Text = $"➕ 新记录已添加 - {DateTime.Now:HH:mm:ss}";
}
catch (Exception ex)
{
MessageBox.Show($"添加失败:{ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnDelete_Click(object sender, EventArgs e)
{
try
{
if (dataGridView.SelectedRows.Count > 0)
{
var result = MessageBox.Show("确定要删除选中的记录吗?", "确认删除",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
databaseManager?.DeleteSelectedRecord(dataGridView.SelectedRows[0].Index);
toolStripStatusLabel.Text = $"🗑️ 记录已删除 - {DateTime.Now:HH:mm:ss}";
}
}
else
{
MessageBox.Show("请先选择要删除的行!", "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"删除失败:{ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnSaveChanges_Click(object sender, EventArgs e)
{
try
{
databaseManager?.SaveAllChanges();
toolStripStatusLabel.Text = $"💾 所有更改已保存 - {DateTime.Now:HH:mm:ss}";
}
catch (Exception ex)
{
MessageBox.Show($"保存失败:{ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// 按钮悬停效果
private void Button_MouseEnter(object sender, EventArgs e)
{
if (sender is Button btn)
{
btn.FlatAppearance.BorderSize = 1;
btn.FlatAppearance.BorderColor = Color.White;
}
}
private void Button_MouseLeave(object sender, EventArgs e)
{
if (sender is Button btn)
{
btn.FlatAppearance.BorderSize = 0;
}
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
databaseManager?.Dispose();
base.OnFormClosed(e);
}
private void Form3_Load(object sender, EventArgs e)
{
InitializeForm();
}
}
// 🎯 企业级数据库管理器
public class DatabaseDataGridManager : IDisposable
{
private readonly string connectionString;
private DataGridView dataGridView;
private DataTable dataTable;
private SqlDataAdapter dataAdapter;
private SqlCommandBuilder commandBuilder;
public DatabaseDataGridManager(string connStr, DataGridView dgv)
{
connectionString = connStr;
dataGridView = dgv;
InitializeDataGrid();
}
private void InitializeDataGrid()
{
// 🔥 企业级配置
dataGridView.AutoGenerateColumns = true; // 数据库场景可以自动生成
dataGridView.ReadOnly = false;
dataGridView.AllowUserToDeleteRows = false; // 安全起见
dataGridView.AllowUserToAddRows = false; // 通过按钮控制
// 注册事件
dataGridView.CellValueChanged += OnDatabaseCellChanged;
dataGridView.CellEndEdit += OnCellEndEdit;
}
// 🎯 收藏级方法:加载数据库数据
public void LoadDataFromDatabase()
{
try
{
using (var connection = new SqlConnection(connectionString))
{
// 创建适配器和命令构建器
dataAdapter = new SqlDataAdapter("SELECT * FROM People ORDER BY Id", connection);
commandBuilder = new SqlCommandBuilder(dataAdapter);
dataTable = new DataTable();
// 🔥 关键:Fill方法一次性完成连接、查询、断开
dataAdapter.Fill(dataTable);
dataGridView.DataSource = dataTable;
// 美化显示
FormatColumns();
}
}
catch (SqlException sqlEx)
{
if (sqlEx.Number == 2) // 服务器未找到
{
throw new Exception("无法连接到SQL Server,请检查服务器是否运行");
}
else if (sqlEx.Number == 208) // 表不存在
{
CreateSampleTable();
LoadDataFromDatabase(); // 重新加载
}
else
{
throw new Exception($"数据库错误:{sqlEx.Message}");
}
}
catch (Exception ex)
{
throw new Exception($"数据加载失败:{ex.Message}");
}
}
private void CreateSampleTable()
{
try
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var createTableCommand = new SqlCommand(@"
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='People' AND xtype='U')
CREATE TABLE People (
Id INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
Age INT NOT NULL,
City NVARCHAR(50),
Email NVARCHAR(100),
CreateDate DATETIME DEFAULT GETDATE()
)", connection);
createTableCommand.ExecuteNonQuery();
// 插入示例数据
var insertCommand = new SqlCommand(@"
INSERT INTO People (Name, Age, City, Email) VALUES
(N'张三', 25, N'北京', 'zhangsan@email.com'),
(N'李四', 30, N'上海', 'lisi@email.com'),
(N'王五', 28, N'广州', 'wangwu@email.com'),
(N'赵六', 35, N'深圳', 'zhaoliu@email.com')", connection);
insertCommand.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw new Exception($"创建示例表失败:{ex.Message}");
}
}
private void FormatColumns()
{
// 等待列生成完成
if (dataGridView.Columns.Count == 0)
{
dataGridView.Refresh();
Application.DoEvents(); // 确保UI更新完成
}
try
{
// 🔥 安全检查每一列
var idColumn = dataGridView.Columns["Id"];
if (idColumn != null)
{
idColumn.HeaderText = "编号";
idColumn.ReadOnly = true;
idColumn.DefaultCellStyle.BackColor = Color.LightGray;
idColumn.Width = 60;
}
var nameColumn = dataGridView.Columns["Name"];
if (nameColumn != null)
{
nameColumn.HeaderText = "姓名";
nameColumn.Width = 100;
}
var ageColumn = dataGridView.Columns["Age"];
if (ageColumn != null)
{
ageColumn.HeaderText = "年龄";
ageColumn.Width = 60;
}
var cityColumn = dataGridView.Columns["City"];
if (cityColumn != null)
{
cityColumn.HeaderText = "城市";
cityColumn.Width = 100;
}
var emailColumn = dataGridView.Columns["Email"];
if (emailColumn != null)
{
emailColumn.HeaderText = "邮箱";
emailColumn.Width = 150;
}
var createDateColumn = dataGridView.Columns["CreateDate"];
if (createDateColumn != null)
{
createDateColumn.HeaderText = "创建时间";
createDateColumn.ReadOnly = true;
createDateColumn.DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
}
}
catch (Exception ex)
{
// 记录日志但不中断程序
System.Diagnostics.Debug.WriteLine($"列格式化警告: {ex.Message}");
}
}
private void OnDatabaseCellChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return;
try
{
// 标记行为已修改
DataRow modifiedRow = dataTable.Rows[e.RowIndex];
// DataRow会自动跟踪更改状态
}
catch (Exception ex)
{
MessageBox.Show($"数据更改失败:{ex.Message}", "错误");
// 回滚更改
dataTable.RejectChanges();
dataGridView.Refresh();
}
}
private void OnCellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var dgv = sender as DataGridView;
var cell = dgv[e.ColumnIndex, e.RowIndex];
string columnName = dgv.Columns[e.ColumnIndex].Name;
// 数据验证
switch (columnName)
{
case "Age":
if (!int.TryParse(cell.Value?.ToString(), out int age) || age < 0 || age > 150)
{
MessageBox.Show("请输入有效的年龄(0-150)!", "数据验证");
cell.Value = DBNull.Value;
return;
}
break;
case "Name":
if (string.IsNullOrWhiteSpace(cell.Value?.ToString()))
{
MessageBox.Show("姓名不能为空!", "数据验证");
cell.Value = "未命名";
return;
}
break;
case "Email":
string email = cell.Value?.ToString();
if (!string.IsNullOrEmpty(email) && !IsValidEmail(email))
{
MessageBox.Show("请输入有效的邮箱格式!", "数据验证");
cell.Value = DBNull.Value;
return;
}
break;
}
}
// 🎯 企业级更新方法:批量保存所有更改
public void SaveAllChanges()
{
try
{
if (dataAdapter != null && dataTable != null)
{
// 🔥 重新创建连接和适配器
using (var connection = new SqlConnection(connectionString))
{
// 重新设置适配器的连接
dataAdapter.SelectCommand.Connection = connection;
// 重新生成Insert、Update、Delete命令
commandBuilder = new SqlCommandBuilder(dataAdapter);
// 执行更新
dataAdapter.Update(dataTable);
dataTable.AcceptChanges();
}
}
}
catch (Exception ex)
{
throw new Exception($"保存失败:{ex.Message}");
}
}
public void AddNewRecord()
{
try
{
DataRow newRow = dataTable.NewRow();
newRow["Name"] = "新用户";
newRow["Age"] = 20;
newRow["City"] = "北京";
newRow["Email"] = "new@email.com";
dataTable.Rows.Add(newRow);
}
catch (Exception ex)
{
throw new Exception($"添加记录失败:{ex.Message}");
}
}
public void DeleteSelectedRecord(int rowIndex)
{
try
{
if (rowIndex >= 0 && rowIndex < dataTable.Rows.Count)
{
dataTable.Rows[rowIndex].Delete();
}
}
catch (Exception ex)
{
throw new Exception($"删除记录失败:{ex.Message}");
}
}
private bool IsValidEmail(string email)
{
try
{
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch
{
return false;
}
}
public void Dispose()
{
dataAdapter?.Dispose();
commandBuilder?.Dispose();
dataTable?.Dispose();
if (dataGridView != null)
{
dataGridView.CellValueChanged -= OnDatabaseCellChanged;
dataGridView.CellEndEdit -= OnCellEndEdit;
}
}
}
}

💡 数据库集成避坑指南:
C#// 大量数据加载时暂停重绘,提升性能
dataGridView.SuspendLayout();
// ... 进行数据操作
dataGridView.ResumeLayout();
// 虚拟模式处理海量数据
dataGridView.VirtualMode = true;
C#// 隔行变色
dataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;
// 鼠标悬停高亮
dataGridView.DefaultCellStyle.SelectionBackColor = Color.DodgerBlue;
通过以上三个递进式案例,相信你已经对DataGridView有了全面的认识。让我来总结三个最重要的要点:
DataGridView虽然功能强大,但掌握了正确的使用方法,它就会成为你开发WinForm应用的得力助手。记住,实践是最好的老师,建议大家把这些代码在自己的项目中跑一遍,相信会有更深的理解!
🤔 互动时间:
觉得这篇实战指南有用的话,请转发给更多需要的同行!让我们一起提升C#开发技能! 👍
更多C#开发技巧和实战案例,请关注我们的公众号!
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!