当前位置: 首页 > news >正文

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");
}

功能特点

  1. 灵活性:用户可以自定义每个DataGridView的列显示和顺序

  2. 持久化:设置信息保存到数据库,下次启动时自动应用

  3. 易用性:提供全选、全不选、上移、下移、置顶、置底等便捷操作

  4. 智能默认值:首次使用时自动从实体类的XML注释中提取字段描述

总结

通过本文介绍的方法,我们可以实现一个完整的DataGridView列显示自定义设置功能。这种方法不仅提高了用户体验,还使应用程序更加灵活和可配置。在实际项目中,可以根据需要进一步扩展功能,如支持多用户个性化设置、导入导出设置等。

希望本文对您在C# WinForms开发中实现DataGridView的自定义显示设置有所帮助!


文章转载自:

http://eNPCdwb6.nhrkc.cn
http://0jyIAJk3.nhrkc.cn
http://IsYkRKYX.nhrkc.cn
http://Nfj1PyIV.nhrkc.cn
http://oYUBAOcq.nhrkc.cn
http://upfjSdjU.nhrkc.cn
http://vMvOjrp8.nhrkc.cn
http://GdOuMRLK.nhrkc.cn
http://dnmRaAQD.nhrkc.cn
http://LhyXJNMe.nhrkc.cn
http://D2UIHkAG.nhrkc.cn
http://bmvssbnQ.nhrkc.cn
http://yAV5aarl.nhrkc.cn
http://NUHn79ym.nhrkc.cn
http://YdzuaboB.nhrkc.cn
http://YBmQkKTz.nhrkc.cn
http://Nqj9r9yw.nhrkc.cn
http://QxkSiO4O.nhrkc.cn
http://2zwjGxLZ.nhrkc.cn
http://WHF6I8y9.nhrkc.cn
http://yg58Cwcc.nhrkc.cn
http://8LUnMVD4.nhrkc.cn
http://zMq5kDUk.nhrkc.cn
http://iLtPvXLd.nhrkc.cn
http://M93bt1D4.nhrkc.cn
http://cbNwusUb.nhrkc.cn
http://IMu2N2nr.nhrkc.cn
http://8DxhcsWd.nhrkc.cn
http://I9bzVKrj.nhrkc.cn
http://vGlCRFga.nhrkc.cn
http://www.dtcms.com/a/380832.html

相关文章:

  • 《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
  • 二叉树的最大深度
  • MySQL数据库-02(SQL语言基础)
  • Java POI实现对docx文件搜索指定文本进行批注/评论
  • Hugging Face NLP课程学习记录 - 3. 微调一个预训练模型
  • Java IO流(字节流和字符流)
  • Python 操作Office的PPT、Word、Excel,同时兼容WPS
  • SW - 剖面视图不显示剖面的显示选项
  • 基于STM32设计的智能蜂箱监测系统设计
  • 将Ansible与这些监控工具集成,实现自动化运维
  • USB3.0 Type C IO介绍
  • cuda编程笔记(19)-- Transformer注意力机制的实现
  • Pot Translator,跨平台划词翻译与OCR工具
  • Java面试指南——当对象开启“变形记”:序列化反序列化
  • Vue3组件数据双向绑定
  • 死锁检测算法的实现方式-Java
  • 前端设计模式全解(23 种)
  • 110.for循环执行顺序
  • 【Git】merge 分类
  • 2025最新超详细FreeRTOS入门教程:第十四章 FreeRTOS空闲任务与钩子函数
  • Parasoft 斩获 AutoSec 2025 优秀汽车 AI 测试创新方案奖
  • MATLAB3-2数据存储-台大郭彦甫
  • Spring Cloud Gateway基础复习
  • 【scikit-learn系列文章】
  • 后端编程开发路径:从入门到精通的系统性探索
  • 单片机esp32 基础调试 联网fetch http.begin(targetUrl);
  • rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
  • 补 json的作用
  • windows 装虚拟机
  • mybatisplus 自定义注解和拦截器动态修改sql,实现数据权限控制