替换.NET ListBox为ComponentOne C1List后,如何添加DictionaryEntry对象?
替换.NET ListBox为ComponentOne C1List的解决方案
C1List的设计逻辑和原生ListBox略有不同,它更偏向于通过数据绑定来管理列表项,而非直接存储任意对象。针对你遇到的AddItem()仅支持字符串参数的问题,这里有几个实用的解决方案:
方案1:使用数据绑定(推荐)
这是最贴合C1List设计理念的方式,能更清晰地管理键值对,后续维护也更方便:
步骤1:准备数据源
你可以用KeyValuePair快速封装键值信息,或者自定义类来增强可读性:
// 用KeyValuePair快速实现 var listItems = new List<KeyValuePair<string, string>>(); string displayText = FormatPercent(-0.1234, CInt(numFrmDecimalPlaces.Value), TriState.True, TriState.False, TriState.False); listItems.Add(new KeyValuePair<string, string>("False", displayText));
如果需要更清晰的结构,自定义类是更好的选择:
public class FormTypeItem { public string Key { get; set; } public string DisplayText { get; set; } } // 添加项时 var newItem = new FormTypeItem { Key = "False", DisplayText = FormatPercent(-0.1234, CInt(numFrmDecimalPlaces.Value), TriState.True, TriState.False, TriState.False) }; var items = new List<FormTypeItem>(); items.Add(newItem);
步骤2:绑定到C1List
// 设置数据源 c1List1.DataSource = listItems; // 指定界面显示的字段 c1List1.DisplayMember = "DisplayText"; // 若是KeyValuePair则填"Value" // 指定实际业务取值的字段 c1List1.ValueMember = "Key"; // 执行绑定 c1List1.DataBind();
方案2:直接添加C1ListItem并存储值到Tag
如果你不想用数据绑定,也可以通过C1ListItem的Tag属性来存储原始的DictionaryEntry对象:
// 创建C1ListItem,传入要显示的文本 var c1Item = new C1ListItem(FormatPercent(-0.1234, CInt(numFrmDecimalPlaces.Value), TriState.True, TriState.False, TriState.False)); // 把原来的DictionaryEntry存在Tag里,方便后续获取原始值 c1Item.Tag = new DictionaryEntry("False", c1Item.Text); // 添加到C1List的Items集合 c1List1.Items.Add(c1Item);
后续获取选中项的值时,直接从Tag中取出即可:
if (c1List1.SelectedItem != null) { var entry = (DictionaryEntry)c1List1.SelectedItem.Tag; string key = (string)entry.Key; string value = (string)entry.Value; // 这里处理你的业务逻辑 }
方案3:利用Items.Add(object)并配置显示属性
C1List的Items集合其实支持直接添加对象,只要提前配置DisplayMember和ValueMember,它会自动读取对应属性进行显示:
// 先配置显示和取值对应的属性 c1List1.DisplayMember = "Value"; c1List1.ValueMember = "Key"; // 直接添加DictionaryEntry对象 c1List1.Items.Add(new DictionaryEntry("False", FormatPercent(-0.1234, CInt(numFrmDecimalPlaces.Value), TriState.True, TriState.False, TriState.False)));
这种方式最接近你原来的代码写法,不需要额外封装类或集合,但可读性稍弱一些。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

