ComboBox не показывает текст - PullRequest
1 голос
/ 31 августа 2011

У меня есть следующий код, который я пытаюсь использовать для заполнения ComboBox, но он не показывает фактический текст объектов, которые я добавляю.

internal partial class SortBox : UserControl {
    private Field[] FieldReferences
    ...
    internal Field[] Fields {
        ...
        set {
            this.FieldReferences = value;
            this.cboFields.Items.Clear();
            string NoneString = "(none)";
            this.cboFields.Items.Add(NoneString);
            this.cboFields.SelectedItem = NoneString;
            foreach (Field Field in this.FieldReferences) {
                MessageBox.Show(Field.ToString()); // <- This displays what I want displayed perfectly.
                this.cboFields.Items.Add(Field);
            }
        }
    }
    ...
}

public partial class Field : UserControl {
    protected string LabelValue;
    ...
    public override string ToString() {
        return this.LabelValue;
    }
}

Вот что я получаю; они все пустые:

Screenshot

Что я делаю не так?

РЕДАКТИРОВАТЬ: Очевидно, мой класс Field наследуется от UserControl. Я провел несколько тестов, и, очевидно, это как-то связано с тем, что класс наследуется от System.ComponentModel.Component.

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Если я правильно читаю ваш код, вы пытаетесь поместить пользовательский контроль в поле со списком.

При этом переопределение ToString не будет работать, поэтому код, который у вас в данный момент работает, просто измените DrawMode:

Это работает:

cboFields.DrawMode = DrawMode.OwnerDrawFixed;
cboFields.DrawItem += new DrawItemEventHandler(cboFields_DrawItem);

private void cboFields_DrawItem(object sender, DrawItemEventArgs e)
{
  e.DrawBackground();
  if (e.Index > -1)
    e.Graphics.DrawString(cboFields.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds);
}

Но я должен сказать, я не знаю, является ли наилучшим способом сделать UserControl внутри коллекции ComboBox,Я бы серьезно подумал о рефакторинге по-другому.

0 голосов
/ 31 августа 2011

Элементы, которые вы добавляете в поле со списком, также должны быть строками, как в вашем окне сообщения.

Попробуйте: this.cboFields.Items.Add(Field.ToString());

В качестве альтернативы, вы можете попытаться установить поле DisplayMember,хотя ToString уже должен быть по умолчанию:

this.cboFields.DisplayMember = "ToString()"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...