试图覆盖ComboBox的字典ToString

时间:2011-12-07 17:40:40

标签: c# dictionary override tostring

我试图通过覆盖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)"
      }

2 个答案:

答案 0 :(得分:2)

我会尝试在您的DisplayValue课程中添加ComboElement媒体资源,然后将DisplayMember的{​​{1}}设置为此媒体资源的名称。

答案 1 :(得分:1)

似乎Windows窗体代码特殊情况下会出现一些.NET类,并且不会在它们上面调用ToString()来获得所宣传的文本表示。

您可以通过ComboElement实现IDictionary<string, object>而不是从Dictionary<string, object>派生来解决此问题,并编写转发给Dictionary成员的所有方法的实现ComboElement 1}}会聚合。去¹并没有真正的收获是很麻烦的,但这是你获得你想要的行为的唯一方式。

¹或者可能没那么麻烦:JetBrains ReSharper(我一直使用并高度推荐)可以自动为你编写所有的转发代码。