C# DataGridView表头自定义设置全攻略
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的自定义显示设置有所帮助!