Попытка переопределить словарь ToString для ComboBox - PullRequest
3 голосов
/ 07 декабря 2011

Я пытаюсь сохранить метаданные в своих элементах ComboBox, переопределяя ToString () в Dictionary <>. Тем не менее, мой переопределение ToString () не выполняется, и я не могу понять, почему. ComboBox отображает «(Коллекция)» вместо указанного мной значения. Не хватает ли шага, чтобы 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 "";
  }
}

Код для заполнения ComboBox в DropDown:

      while ( sdr.Read() == true ) {
        ComboElement ce = new ComboElement( sdr, "filename" );
        string tstring = ce.ToString(); // Correct value
        cmbFiles.Items.Add( ce ); // Displays "(Collection)"
      }

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Я бы попытался добавить свойство DisplayValue к вашему классу ComboElement, а затем установить DisplayMember из ComboBox для имени этого свойства.

1 голос
/ 07 декабря 2011

Похоже, что Windows Forms кодирует особые случаи некоторых классов .NET и не вызывает для них ToString(), чтобы получить текстовое представление, как объявлено.

Вы можете обойти это, сделав ComboElement реализуйте IDictionary<string, object> вместо производных от Dictionary<string, object> и напишите реализации всех методов, которые пересылают элементу Dictionary, который ComboElement будет агрегировать.Это большая проблема, но без реальной выгоды, но это единственный способ получить желаемое поведение.

r Или, возможно, не так уж много проблем: JetBrains ReSharper (который я использую всевремя и настоятельно рекомендуем) может написать весь код пересылки автоматически для вас.

...