【C#】用 DevExpress 创建带“下拉子表”的参数表格视图

展示如何用 DevExpress 创建带"下拉子表"的参数表格视图。主表为 参数行 ParamRow,子表为 子项 ChildParam


一、创建模型类

csharp 复制代码
public class ParamRow
{
    public string Pn { get; set; }
    public string DisplayName { get; set; }
    public string Value { get; set; }
    public List<ChildParam> Children { get; set; } = new List<ChildParam>();
}

public class ChildParam
{
    public string Name { get; set; }
    public string Value { get; set; }
}

二、WinForms 主窗体代码(Form1.cs

csharp 复制代码
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        InitGrid();
    }

    private void InitGrid()
    {
        // 初始化控件
        var gridControl = new DevExpress.XtraGrid.GridControl
        {
            Dock = DockStyle.Fill
        };
        var gridView = new DevExpress.XtraGrid.Views.Grid.GridView(gridControl);
        gridControl.MainView = gridView;
        gridControl.ViewCollection.Add(gridView);
        this.Controls.Add(gridControl);

        // 假数据
        var data = new BindingList<ParamRow>
        {
            new ParamRow
            {
                Pn = "Pn001", DisplayName = "参数1", Value = "123",
                Children = new List<ChildParam>
                {
                    new ChildParam { Name = "子项1", Value = "A" },
                    new ChildParam { Name = "子项2", Value = "B" }
                }
            },
            new ParamRow
            {
                Pn = "Pn002", DisplayName = "参数2", Value = "456",
                Children = new List<ChildParam>
                {
                    new ChildParam { Name = "子项1", Value = "C" }
                }
            }
        };

        // 主表列
        gridView.Columns.AddVisible("Pn", "参数号");
        gridView.Columns.AddVisible("DisplayName", "名称");
        gridView.Columns.AddVisible("Value", "值");

        gridControl.DataSource = data;

        // 设置 Master-Detail
        gridView.OptionsDetail.ShowDetailTabs = false;
        gridView.OptionsDetail.EnableMasterViewMode = true;

        gridView.MasterRowGetChildList += (s, e) =>
        {
            var row = gridView.GetRow(e.RowHandle) as ParamRow;
            e.ChildList = row?.Children;
        };

        gridView.MasterRowGetRelationName += (s, e) => e.RelationName = "子项";
        gridView.MasterRowGetRelationCount += (s, e) => e.RelationCount = 1;

        gridView.MasterRowGetLevelDefaultView += (s, e) =>
        {
            GridView childView = new GridView(gridControl);
            gridControl.ViewCollection.Add(childView);

            childView.Columns.AddVisible("Name", "子名称");
            childView.Columns.AddVisible("Value", "子值");

            e.DefaultView = childView;
        };
    }
}

三、运行环境

  • 需要 DevExpress.WinForms 组件
  • 使用 Visual Studio 创建 WinForms 项目,将 Form1.cs 替换为上述内容即可运行
相关推荐
存储服务专家StorageExpert1 小时前
NetApp存储基本概念科普:物理层到逻辑层
linux·服务器·网络·netapp存储·存储维护
cnkeysky1 小时前
ubuntu 24.04 从 6.8 内核升级 6.11 网卡加载失败问题
linux·ubuntu
十五年专注C++开发2 小时前
通信中间件 Fast DDS(三) :fastddsgen的安装与使用
linux·c++·windows·中间件·跨平台
tt5555555555552 小时前
Linux 驱动开发与内核通信机制——超详细教程
linux·驱动开发·b树
程序设计实验室2 小时前
在Linux系统上一键配置DoH,解决DNS解析被污染
linux
关关长语2 小时前
Ubuntu 中获取指定软件依赖安装包
linux·运维·ubuntu
山,离天三尺三2 小时前
线程中互斥锁和读写锁相关区别应用示例
linux·c语言·开发语言·面试·职场和发展
dragon_cdut2 小时前
ubuntu22.04 无法清空回收站文件
linux·运维
七七七七072 小时前
【Linux 系统】进程优先级
linux·运维·服务器
scilwb2 小时前
Isaac Sim机械臂教程 - 阶段3:行为系统与决策网络
linux