在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
相关产品推荐
相关产品推荐

