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

替换.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:21