2014-08-30 5 views
0

Мне нужно создать пользовательский comboboxitem, который я могу обработать среди других элементов управления, которые наследуют класс System.Windows.Forms.Control. Поэтому мой comboboxitem должен наследовать System.Windows.Forms.Control, потому что я использую приведение к этому типу и ссылаюсь на свойство Text с циклом. Есть несколько сообщений о том, как создать пользовательский элемент, но тот наследует класс Object, который не работает для меня? ? Я пытался, но оно не работает Вот моя попытка:Как создать пользовательский C# ComboBoxItem, который наследует System.Windows.Forms.Control? если возможно?

public class ComboItem : System.Windows.Forms.Control 
{ 
    public object Value { get; set; } 
    public override string Text { get; set; } 
    // public object Value { get; set; } 
    public ComboItem(string text) { this.Text = text; } 
    public ComboItem(string text, string value) { this.Text = text; this.Value = value; } 
    public override string ToString() 
    { 
     return Text; 
    } 
} 

ничего не отображается в выпадающем списке после выполнения кода

 private void Form1_Load(object sender, EventArgs e) 
    { 
     ComboItem asd = new ComboItem("qweqwwqeq"); 
     ComboItem asd2 = new ComboItem("2222222"); 
     comboBox1.Items.Add(asd); 
     comboBox1.Items.Add(asd2); 
     comboBox1.SelectedIndex = 1; 

    } 

это контекст, в котором я должен использовать:

 System.Windows.Forms.Control ctrl = (System.Windows.Forms.Control)asd["Kontrola"];     
    ctrl.Text = (String)asd["Engleski"]; 
+1

Вы понимаете, что такое «Контроль»? Непонятно, чего вы пытаетесь достичь. Почему вы наследуете ComboboxItem от 'Control'? –

+0

_Почему на земле вы наследовали ComboboxItem из Control? _ Действительный вопрос. OTOH: Почему бы и нет? Использование классов для ComboBox Элементы вполне нормальные, и ComboBoxItems - это хорошее место для хранения нескольких элементов управления как любой, можно предположить. Класс имеет метод ToString, поэтому почему ничего не отображается? Помимо отсутствующей строки displayString элементы управления из элементов combobox работают очень хорошо: вы можете добавить их в форму и использовать их. – TaW

+1

@TaW Что значит? Я не против использования класса ComboBoxItem, почему вам нужно наследовать его из-под контроля? Если вам вообще нужно сохранить некоторый элемент управления, вы можете обернуть его в свой класс. Наследование от 'Control' не имеет смысла. –

ответ

0

Я предполагаю, что вы действительно не говорите о ComboBoxItem Class, который находится от WPF, а просто от Winforms Combobox, который содержит objects.

По какой-либо причине элементы управления не отображаются в коллекциях, если они фактически не размещены в Контейнерном контроле.

Таким образом, вы, вероятно, придется обернуть управления в минимальном классе обертке, как это:

class CtlWrapper 
{ 
    public Control theControl { get; private set; } 
    public CtlWrapper(string text) 
    { 
     theControl = new Control(); 
     theControl.Text = text; 
    } 
    public CtlWrapper(Control control) { theControl = control; } // for fun 
    public override string ToString() { return theControl.Text; } 
} 

Не уверен, что вы будете делать с таким родовым вещь, как Control в списке элементов в ComboBox, но, возможно, вам Добавлю код для создания разных типов управления ..? С оберткой текст ToString отображается как ожидалось.

Конечно, вы добавляете строку значения или что-то еще, что вам нужно для класса по мере необходимости, или вы можете использовать свой собственный класс как тип «theControl» ..

Редактировать: Для удовольствия я добавил второй конструктор, который позволит добавлять существующие элементы управления (любого типа ;-)

+0

Я не говорил о «ComboBoxItem» Clas, и ваш ответ работает, и он отображает текст в поле со списком и tankh вы :) Но это не должно быть обернуто beacause того, как я его использую. Он должен унаследоваться от класса «Контроль». –

+0

У меня есть «DataTable», в котором хранятся метки, групповые группы и т. Д., Все из которых являются «Control», унаследованными в первом столбце. Другие столбцы содержат переводы для текстовых полей Controls. Поэтому таблица используется для переключения текстов меток и групповых полей на другие langugas. Мне нужно перевести элементы со списком также на том, что я не могу использовать этот листинг явно '((System.Windows.Forms.Control) comboBox1.SelectedItem) .Text' beacuse это не iinherting класс 'Control'.Я знаю, что для этого могут быть более элегантные решения, но я просто придерживался этого и хочу видеть, как это можно сделать так: –

+0

Ну, с достаточным количеством скобок, посыпанной над кодом, я уверен, что вы можете получить это работать. Но вместо '((System.Windows.Forms.Control) comboBox1.SelectedItem) .Text'' вы можете просто написать' ((CtlWrapper) comboBox1.SelectedItem) .theControl.Text' – TaW

Смежные вопросы