C# DataGridView表头自定义设置全攻略

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到