You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在BrightIdeasSoftware.TreeListView列中添加ComboBox并绑定模型属性

问题描述
  • 在TreeListView的指定列中添加ComboBox,该ComboBox显示对应实体有权限的用户列表,支持选择操作
  • 用户选择下拉项后,将选中项的文本赋值给对应ModelMapping对象的AccountName属性
  • 当前该列以标签形式展示AccountName值,需要改为ComboBox选择形式

现有相关代码

列配置

this.colMappedAccount.AspectName = "AccountName";
this.colMappedAccount.Text = "Account";

TreeListView数据填充

List<ModelMapping> UserMappings = GetAccountsMapping();
List<ModelMapping> roots = new List<ModelMapping>();
roots.AddRange(UserMappings.Where(m => m.Parent == "root").ToList());
tvMapping.Roots = roots;

TreeListView展开与子项委托

tvMapping.CanExpandGetter = delegate (object x)
{
    return ((ModelMapping)x).Parent == "root";
};

tvMapping.ChildrenGetter = delegate (object x)
{
    var mapping = (ModelMapping)x;
    List<ModelMapping> mappings = DatasetUserMappings.Where(d => d.Parent.Equals(mapping.Product, StringComparison.OrdinalIgnoreCase)).ToList();
    if (mappings == null) mappings = new List<ModelMapping>();
    return mappings;
};

ModelMapping实体类

public class ModelMapping
{
    string product;
    string parent;
    string productName;
    string accountName;
  
    public string Product { get => product; set => product = value; }
    public string Parent { get => parent; set => parent = value; }
    public string ProductName { get => productName; set => productName = value; }        
    public string AccountName { get => accountName; set => accountName = value; }
    public string Name { get => Parent == "root" ? productName : "Child"; }
}

实现方案

1. 为列绑定ComboBox编辑器

给目标列指定ComboBox作为单元格编辑器,并设置触发编辑的方式:

// 初始化ComboBox编辑器
var comboEditor = new BrightIdeasSoftware.ComboBoxEditor();
colMappedAccount.CellEditor = comboEditor;
// 设置点击单元格即可激活编辑
colMappedAccount.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;

2. 动态加载对应实体的用户列表

通过CellEditorInitializing事件,针对每一行单元格加载该实体对应的有权限用户列表:

tvMapping.CellEditorInitializing += (sender, e) =>
{
    if (e.Column == colMappedAccount)
    {
        var combo = e.Control as ComboBox;
        if (combo != null)
        {
            // 获取当前行对应的实体对象
            var mapping = e.RowObject as ModelMapping;
            // 替换为你的业务逻辑:根据实体获取有权限的用户列表
            var authorizedUsers = GetAuthorizedUsers(mapping);
            
            combo.Items.Clear();
            combo.Items.AddRange(authorizedUsers.ToArray());
            // 默认选中当前AccountName的值
            combo.Text = mapping.AccountName;
            // 可选:设置为仅允许选择列表项,禁止手动输入
            // combo.DropDownStyle = ComboBoxStyle.DropDownList;
        }
    }
};

3. 保存选择结果到AccountName属性

通过CellEditFinishing事件,将用户选择的内容同步到实体属性:

tvMapping.CellEditFinishing += (sender, e) =>
{
    if (e.Column == colMappedAccount)
    {
        var combo = e.Control as ComboBox;
        if (combo != null && !string.IsNullOrEmpty(combo.Text))
        {
            var mapping = e.RowObject as ModelMapping;
            // 更新实体的AccountName属性
            mapping.AccountName = combo.Text;
            // 刷新该行显示,确保界面同步
            tvMapping.RefreshObject(mapping);
        }
    }
};

补充说明

  • GetAuthorizedUsers方法需要根据你的业务逻辑实现,传入ModelMapping对象,返回该实体对应的有权限用户名称列表
  • 如果需要支持手动输入用户名称,保持默认的DropDown样式即可;若仅允许选择列表项,设置combo.DropDownStyle = ComboBoxStyle.DropDownList

内容的提问来源于stack exchange,提问作者CSharper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:40:03