它是 C# WinForm 中用于數(shù)據(jù)展示、編輯、交互的核心控件,支持多種數(shù)據(jù)綁定方式、樣式自定義和用戶操作處理,下面從核心功能到實(shí)戰(zhàn)細(xì)節(jié)逐一講解。
一、核心前提:控件添加
**1. 可視化添加(推薦,WinForm 項(xiàng)目**
C打開 Visual Studio 窗體設(shè)計(jì)器,從「工具箱」的「數(shù)據(jù)」分類中找到 DataGridView,拖拽到窗體上,可通過鼠標(biāo)調(diào)整大小和位置。
2. 代碼動(dòng)態(tài)添加
在窗體的 Load 事件或自定義方法中編寫代碼,手動(dòng)創(chuàng)建并添加控件:
using System.Windows.Forms;
private void Form1_Load(object sender, EventArgs e)
{
DataGridView dgv = new DataGridView();
dgv.Dock = DockStyle.Fill;
dgv.Name = "dgvStudent";
dgv.TabIndex = 0;
this.Controls.Add(dgv);
}
二、數(shù)據(jù)綁定(核心功能)
DataGridView 支持兩種核心數(shù)據(jù)綁定方式,其中數(shù)據(jù)綁定(非手動(dòng)添加列 / 行)是項(xiàng)目開發(fā)中的主流方式,效率更高、可維護(hù)性更強(qiáng)。
方式 1:綁定到自定義實(shí)體類集合(最常用,業(yè)務(wù)開發(fā)首選)
適合展示結(jié)構(gòu)化業(yè)務(wù)數(shù)據(jù)(如學(xué)生、訂單、商品等),步驟清晰且易擴(kuò)展。
- 第一步:定義自定義實(shí)體類(示例:學(xué)生類)
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string ClassName { get; set; }
}
- 第二步:構(gòu)建實(shí)體集合并綁定到 DataSource 屬性
private void BindDataToDgv()
{
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)班"}
};
dgvStudent.DataSource = studentList;
}
- 調(diào)用綁定方法:在窗體 Load 事件中執(zhí)行 BindDataToDgv();,運(yùn)行后即可自動(dòng)生成列并展示數(shù)據(jù)。
方式 2:綁定到 DataTable(靈活,適合動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu))
適合數(shù)據(jù)列不固定、需要?jiǎng)討B(tài)構(gòu)建表格結(jié)構(gòu)的場景(如導(dǎo)出報(bào)表、動(dòng)態(tài)查詢結(jié)果展示)。
private void BindDataTableToDgv()
{
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));
dt.Rows.Add(1, "張三", 18, "高一(1)班");
dt.Rows.Add(2, "李四", 17, "高一(2)班");
dt.Rows.Add(3, "王五", 18, "高一(1)班");
dgvStudent.DataSource = dt;
}
補(bǔ)充:手動(dòng)添加列和行(非綁定模式,適合簡單靜態(tài)數(shù)據(jù))
無需數(shù)據(jù)源,直接手動(dòng)構(gòu)建表格內(nèi)容,靈活性低,僅適合少量靜態(tài)數(shù)據(jù)展示。
private void AddColumnAndRowManually()
{
dgvStudent.Columns.Add("IdColumn", "學(xué)生ID");
dgvStudent.Columns.Add("NameColumn", "學(xué)生姓名");
dgvStudent.Columns.Add("AgeColumn", "年齡");
dgvStudent.Rows.Add(1, "張三", 18);
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);
}
三、關(guān)鍵屬性配置(優(yōu)化展示和交互)
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;
dgvStudent.AllowUserToAddRows = false;
dgvStudent.AllowUserToDeleteRows = false;
dgvStudent.AllowUserToResizeColumns = true;
dgvStudent.MultiSelect = false;
dgvStudent.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
四、獲取選中行 / 單元格數(shù)據(jù)(常用交互操作)
開發(fā)中常需要獲取用戶選中的數(shù)據(jù)進(jìn)行后續(xù)處理(如修改、刪除),核心是通過 SelectedRows 或 CurrentCell 實(shí)現(xiàn)。
1. 獲取選中整行數(shù)據(jù)(推薦,整行選擇模式下)
private void btnGetSelectedRow_Click(object sender, EventArgs e)
{
if (dgvStudent.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dgvStudent.SelectedRows[0];
int id = Convert.ToInt32(selectedRow.Cells[0].Value);
string name = selectedRow.Cells[1].Value.ToString();
int id2 = Convert.ToInt32(selectedRow.Cells["Id"].Value);
string name2 = selectedRow.Cells["Name"].Value.ToString();
MessageBox.Show($"選中學(xué)生:ID={id2},姓名={name2}");
}
else
{
MessageBox.Show("請先選中一行數(shù)據(jù)!");
}
}
2. 獲取單個(gè)單元格數(shù)據(jù)
private void dgvStudent_CellClick(object sender, DataGridViewCellEventArgs e)
{
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($"選中單元格內(nèi)容:{content}");
}
}
五、常用事件(處理用戶操作)
DataGridView 提供了豐富的事件,用于響應(yīng)用戶的編輯、點(diǎn)擊、選擇等操作,以下是最常用的 3 個(gè)事件。
1. CellClick 事件:單元格點(diǎn)擊事件
- 響應(yīng)用戶點(diǎn)擊任意單元格的操作,上文已演示,可用于獲取單元格數(shù)據(jù)、觸發(fā)詳情展示等。
2. CellValueChanged 事件:單元格值改變事件
當(dāng)單元格內(nèi)容被修改并失去焦點(diǎn)時(shí)觸發(fā)(僅 ReadOnly=false 時(shí)有效),用于監(jiān)聽數(shù)據(jù)編輯操作。
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($"學(xué)生「{studentName}」的「{changedColumn}」已修改為:{newValue}");
}
}
3. RowHeaderMouseClick 事件:行頭點(diǎn)擊事件
響應(yīng)用戶點(diǎn)擊左側(cè)行頭的操作,常用于快速選中整行或觸發(fā)行相關(guān)操作。
private void dgvStudent_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex >= 0)
{
dgvStudent.Rows[e.RowIndex].Selected = true;
string tip = $"已選中第 {e.RowIndex + 1} 行數(shù)據(jù)";
lblTip.Text = tip;
}
}
六、高級功能:數(shù)據(jù)篩選與刷新
1. 數(shù)據(jù)篩選(綁定模式下)
綁定 List 或 DataTable 后,無需重新構(gòu)建表格,只需篩選數(shù)據(jù)源再重新綁定即可。
private void btnFilter_Click(object sender, EventArgs e)
{
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)班"}
};
var filteredList = originalList.Where(s => s.Age == 18).ToList();
dgvStudent.DataSource = null;
dgvStudent.DataSource = filteredList;
}
2. 數(shù)據(jù)刷新(新增 / 修改 / 刪除后)
當(dāng)數(shù)據(jù)源發(fā)生變化(如新增學(xué)生、修改信息),只需重新給 DataSource 賦值即可刷新表格:
private void btnAddStudent_Click(object sender, EventArgs e)
{
List<Student> studentList = (List<Student>)dgvStudent.DataSource;
if (studentList == null) studentList = new List<Student>();
studentList.Add(new Student(){ Id=4, Name="趙六", Age=17, ClassName="高一(2)班"});
dgvStudent.DataSource = null;
dgvStudent.DataSource = studentList;
}
七、總結(jié)
1、 DataGridView 核心是數(shù)據(jù)綁定,推薦優(yōu)先使用「實(shí)體類集合」或「DataTable」綁定,效率遠(yuǎn)高于手動(dòng)添加列 / 行。
2、關(guān)鍵操作:通過 DataSource 綁定數(shù)據(jù)、通過 SelectedRows 獲取選中數(shù)據(jù)、通過重新綁定實(shí)現(xiàn)數(shù)據(jù)刷新。
3、優(yōu)化體驗(yàn):合理配置外觀和交互屬性(隔行變色、整行選擇、禁止空行),使用常用事件響應(yīng)用戶操作。
4、適用場景:WinForm 項(xiàng)目中所有結(jié)構(gòu)化數(shù)據(jù)的展示、編輯、篩選需求,是桌面開發(fā)中數(shù)據(jù)交互的核心控件。
轉(zhuǎn)自https://blog.csdn.net/kylezhao2019/article/details/156911028
該文章在 2026/3/10 10:46:23 編輯過