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的自定义显示设置有所帮助!