我试图通过覆盖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 "";
}
}
在DropDown上填充ComboBox的代码:
while ( sdr.Read() == true ) {
ComboElement ce = new ComboElement( sdr, "filename" );
string tstring = ce.ToString(); // Correct value
cmbFiles.Items.Add( ce ); // Displays "(Collection)"
}
答案 0 :(得分:2)
我会尝试在您的DisplayValue
课程中添加ComboElement
媒体资源,然后将DisplayMember
的{{1}}设置为此媒体资源的名称。
答案 1 :(得分:1)
似乎Windows窗体代码特殊情况下会出现一些.NET类,并且不会在它们上面调用ToString()
来获得所宣传的文本表示。
您可以通过ComboElement
实现IDictionary<string, object>
而不是从Dictionary<string, object>
派生来解决此问题,并编写转发给Dictionary
成员的所有方法的实现ComboElement
1}}会聚合。去¹并没有真正的收获是很麻烦的,但这是你获得你想要的行为的唯一方式。
¹或者可能没那么麻烦:JetBrains ReSharper(我一直使用并高度推荐)可以自动为你编写所有的转发代码。