C#DataGridView表头显示自定义设置(是否显示、显示位置)全过程
概述
在C# WinForms应用程序开发中,DataGridView是展示数据的主要控件之一。但在实际项目中,我们经常需要根据用户需求动态调整DataGridView的列显示、隐藏以及顺序。本文将详细介绍如何通过自定义控件和类来实现DataGridView表头显示设置的全过程,首次使用时自动从实体类的XML注释中提取字段描述。
实现思路
1. 数据库表设计
首先我们需要设计一个数据库表来存储显示设置信息:
CREATE TABLE tb_show_setting (
id INT PRIMARY KEY IDENTITY(1,1),
field_key NVARCHAR(50), -- 字段名称
field_value NVARCHAR(100), -- 字段描述
is_show INT, -- 是否显示(1显示,0隐藏)
class_name NVARCHAR(100), -- 类名
data_gridView_name NVARCHAR(100) -- DataGridView名称
)
2. 实体类设计
创建对应的实体类:
public partial class tb_show_setting
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int id { get; set; }
public string field_key { get; set; }
public string field_value { get; set; }
public int is_show { get; set; }
public string class_name { get; set; }
public string data_gridView_name { get; set; }
}
3. 设置窗体实现

创建设置窗体FrmShowSetting,用于管理DataGridView的列显示设置:
public partial class FrmShowSetting : Form
{
List<tb_show_setting> showSettigList = new List<tb_show_setting>();
Dictionary<string, string> typeDic = new Dictionary<string, string>();
List<tb_show_setting> showFieldList = new List<tb_show_setting>();
string _className = "";
string _dataGridViewName = "";
public FrmShowSetting(string className, string dataGridViewName)
{
_className = className;
_dataGridViewName = dataGridViewName;
InitializeComponent();
DgvData.AutoGenerateColumns = false;
DgvData.ColumnHeadersVisible = false;
DgvData.Columns[DgvData.ColumnCount - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
// 窗体加载事件
private void FrmShowSetting_Load(object sender, EventArgs e)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("class_name", _className);
dic.Add("data_gridView_name", _dataGridViewName);
showFieldList = ShowSettingService.GetDataByDic(dic);
if (showFieldList.Count <= 0) {
var pidic = typeof(tb_flow_record).GetProperties();
foreach (var pi in pidic)
{
var summary = pi.GetXmlDocsSummary();
if (!string.IsNullOrEmpty(summary))
{
tb_show_setting showSetting = new tb_show_setting();
tb_show_setting showField = new tb_show_setting();
showField.field_key = pi.Name;
showField.field_value = summary;
showFieldList.Add(showField);
}
}
}
DgvData.DataSource = showFieldList;
for (var i = 0; i < showFieldList.Count(); i++) {
DgvData.Rows[i].Cells["ColChk"].Value = showFieldList[i].is_show == 1 ? true : false;
}
}
// 全选按钮
private void BtnAllSelcet_Click(object sender, EventArgs e)
{
for (int i = 0; i < DgvData.RowCount; i++)
{
DgvData.Rows[i].Cells["ColChk"].Value = true;
}
}
// 全不选按钮
private void BtnAllNoSelcet_Click(object sender, EventArgs e)
{
for (int i = 0; i < DgvData.RowCount; i++)
{
DgvData.Rows[i].Cells["ColChk"].Value = false;
}
}
// 置顶按钮
private void BtnTop_Click(object sender, EventArgs e)
{
tb_show_setting showField = new tb_show_setting();
int i = DgvData.SelectedRows[0].Index;
showField = showFieldList[i];
showFieldList.RemoveAt(i);
DgvData.SelectedRows[0].Selected = false;
showFieldList.Insert(0, showField);
ShowDgvData();
DgvData.Rows[0].Selected = true;
}
// 置底按钮
private void BtnLast_Click(object sender, EventArgs e)
{
tb_show_setting showField = new tb_show_setting();
int i = DgvData.SelectedRows[0].Index;
showField = showFieldList[i];
showFieldList.RemoveAt(i);
DgvData.SelectedRows[0].Selected = false;
showFieldList.Add(showField);
ShowDgvData();
DgvData.Rows[DgvData.RowCount-1].Selected = true;
}
// 刷新DataGridView显示
private void ShowDgvData()
{
DgvData.DataSource = new List<object>();
DgvData.DataSource = showFieldList;
this.BindingContext[DgvData.DataSource].ResumeBinding();
for (var i = 0; i < showFieldList.Count(); i++)
{
DgvData.Rows[i].Cells["ColChk"].Value = showFieldList[i].is_show == 1 ? true : false;
}
}
// 上移按钮
private void BtnUpward_Click(object sender, EventArgs e)
{
tb_show_setting showField = new tb_show_setting();
tb_show_setting showField1 = new tb_show_setting();
int i = DgvData.SelectedRows[0].Index;
DgvData.SelectedRows[0].Selected = false;
if (i == 0 || DgvData.RowCount < 2)
{
return;
}
showField = showFieldList[i];
showField1 = showFieldList[i-1];
showFieldList[i-1] = showField;
showFieldList[i] = showField1;
ShowDgvData();
DgvData.Rows[i-1].Selected = true;
}
// 下移按钮
private void BtnNext_Click(object sender, EventArgs e)
{
tb_show_setting showField = new tb_show_setting();
tb_show_setting showField1 = new tb_show_setting();
int i = DgvData.SelectedRows[0].Index;
DgvData.SelectedRows[0].Selected = false;
if (i == DgvData.RowCount-1 || DgvData.RowCount < 2)
{
return;
}
showField = showFieldList[i];
showField1 = showFieldList[i +1];
showFieldList[i + 1] = showField;
showFieldList[i] = showField1;
ShowDgvData();
DgvData.Rows[i + 1].Selected = true;
}
// 退出按钮
private void BtnExit_Click(object sender, EventArgs e)
{
this.Close();
this.Dispose();
}
// 保存按钮
private void BtnSave_Click(object sender, EventArgs e)
{
if (DgvData.RowCount == 0) {
return;
}
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("data_gridView_name", _dataGridViewName);
ShowSettingService.DeleteByDic(dic);
tb_show_setting _showField = new tb_show_setting();
for (int i = 0; i < DgvData.RowCount; i++)
{
_showField = new tb_show_setting();
_showField.field_key = showFieldList[i].field_key;
_showField.field_value = showFieldList[i].field_value;
_showField.is_show = (bool.Parse(DgvData.Rows[i].Cells["ColChk"].Value == null ? "false" : DgvData.Rows[i].Cells["ColChk"].Value.ToString())) ? 1 : 0;
_showField.class_name = _className;
_showField.data_gridView_name = _dataGridViewName;
ShowSettingService.Save(_showField);
}
this.Close();
this.Dispose();
}
}
4. 应用设置到DataGridView
创建一个工具方法,用于根据保存的设置配置DataGridView的列显示:
public static void ShowDgvSetting(DataGridView dataGridView, string ClassName, string dataGridViewName)
{
dataGridView.AutoGenerateColumns = false;
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("class_name", ClassName);
dic.Add("is_show", "1");
dic.Add("data_gridView_name", dataGridViewName);
List<tb_show_setting> showFieldList = ShowSettingService.GetDataByDic(dic);
int i = 0;
dataGridView.Columns.Clear();
foreach (var item in showFieldList)
{
dataGridView.Columns.Add(item.field_key, item.field_value);
dataGridView.Columns[i].DataPropertyName = item.field_key;
i++;
}
Application.DoEvents();
}
使用示例

1. 调用设置窗体
在主窗体中,通过按钮点击事件打开设置窗体:
private void BtnSetting_Click(object sender, EventArgs e)
{
FrmShowSetting frm = new FrmShowSetting("tb_flow_record", "DgvMain");
frm.ShowDialog();
ShowDgvSetting(DgvMain, "tb_flow_record", "DgvMain");
}
2. 应用显示设置
在窗体加载或需要刷新DataGridView显示时调用:
private void FrmMain_Load(object sender, EventArgs e)
{
// 加载数据
// ...
// 应用显示设置
ShowDgvSetting(DgvMain, "tb_flow_record", "DgvMain");
}
功能特点
-
灵活性:用户可以自定义每个DataGridView的列显示和顺序
-
持久化:设置信息保存到数据库,下次启动时自动应用
-
易用性:提供全选、全不选、上移、下移、置顶、置底等便捷操作
-
智能默认值:首次使用时自动从实体类的XML注释中提取字段描述
总结
通过本文介绍的方法,我们可以实现一个完整的DataGridView列显示自定义设置功能。这种方法不仅提高了用户体验,还使应用程序更加灵活和可配置。在实际项目中,可以根据需要进一步扩展功能,如支持多用户个性化设置、导入导出设置等。
希望本文对您在C# WinForms开发中实现DataGridView的自定义显示设置有所帮助!