试图覆盖组合框的ToString字典
本文关键字:ToString 字典 组合 覆盖 | 更新日期: 2023-09-27 18:17:00
我试图通过覆盖Dictionary<>的ToString()将元数据存储在我的ComboBox元素中。然而,我的ToString()覆盖似乎没有执行,我不知道为什么。ComboBox显示"(Collection)",而不是我指定的值。是否有一个步骤,我错过了让ComboBox使用我的ToString()覆盖?
public class ComboElement : Dictionary<string,object> {
protected string defaultkey = "";
public ComboElement( SqlDataReader sdr, string defkey )
: base() {
defaultkey = defkey;
for ( int field = 0; field < sdr.FieldCount; field++ ) {
this.Add( sdr.GetName( field ), sdr[field] );
}
}
public override string ToString() {
return "GLURP"; //
//if ( this.ContainsKey( this.defaultkey ) == true ) { return this[this.defaultkey].ToString(); } else return "";
}
}
在下拉菜单上填充组合框的代码:
while ( sdr.Read() == true ) {
ComboElement ce = new ComboElement( sdr, "filename" );
string tstring = ce.ToString(); // Correct value
cmbFiles.Items.Add( ce ); // Displays "(Collection)"
}
我会尝试将DisplayValue
属性添加到您的ComboElement
类中,然后将ComboBox
的DisplayMember
设置为该属性的名称。
似乎Windows窗体代码特殊情况一些。net类,并没有调用ToString()
在他们得到一个文本表示的广告。
你可以通过让ComboElement
实现IDictionary<string, object>
而不是从Dictionary<string, object>
派生来解决这个问题,并编写转发给ComboElement
将聚合的Dictionary
成员的所有方法的实现。这是一个没有实际收益的大麻烦,但这是你得到你想要的行为的唯一方法。
¹或者可能没有太大的麻烦:JetBrains ReSharper(我一直使用并强烈推荐)可以自动为您编写所有转发代码。