试图覆盖组合框的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)"
      }

试图覆盖组合框的ToString字典

我会尝试将DisplayValue属性添加到您的ComboElement类中,然后将ComboBoxDisplayMember设置为该属性的名称。

似乎Windows窗体代码特殊情况一些。net类,并没有调用ToString()在他们得到一个文本表示的广告。

你可以通过让ComboElement实现IDictionary<string, object>而不是从Dictionary<string, object>派生来解决这个问题,并编写转发给ComboElement将聚合的Dictionary成员的所有方法的实现。这是一个没有实际收益的大麻烦,但这是你得到你想要的行为的唯一方法。

¹或者可能没有太大的麻烦:JetBrains ReSharper(我一直使用并强烈推荐)可以自动为您编写所有转发代码。