C# внешнее отображение полей класса

204
02 мая 2018, 02:55

Вчера в голову пришла интересная мысль. Допустим, у нас есть класс someObject:

class someObject
{
    public int id;
    public string name;
}

И также допустим, что у нас есть comboBox, который нам нужно заполнить этими самыми someObject, которые лежат в каком-то листе, т.е. сделать так:

foreach (var item in list)
{
   comboBox.Items.Add(item);
}

Если сделать это так, то в comboBox будет что-то подобное на каждый элемент:

Form+someObject

Хорошо, пойдём другой дорогой. Будем заполнять вот так:

foreach (var item in list)
{
    comboBox.Items.Add(item.name);
}

Теперь в comboBox'е будет отображаться имя элемента name. Теперь после выбора какого-либо элемента из comboBox для получения конкретного элемента листа, нужно будет делать вот так:

someObject currentItem;
foreach (var item in list)
{
    if(item.name == comboBox.Text)
    {
        currentItem = item;
    }
}

Хорошо. Всё это работает. Но есть одно "но": если в листе есть объекты с одинаковыми именами, то после тех же манипуляций, которые описаны выше, мы не всегда будем получать именно тот объект, который нам нужен. Я хочу сказать, что цикл foreach пройдётся по всему листу, сверит имя каждого элемента с comboBox.Text и будет сохранять в переменную последнее проверенное значение.

А если сделать вот так:

someObject currentItem;
foreach (var item in list)
{
    if(item.name == comboBox.Text)
    {
        currentItem = item;
        break;
    }
}

то будет сохраняться только первое значение.

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

foreach (var item in list)
{
   comboBox.Items.Add(item);
}

в comboBox отображалось только имя?

Answer 1

Просто задайте свойство

comboBox.DisplayMember = "name";

Можно использовать конструкцию

comboBox.DisplayMember = nameof(someObject.name);

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

class someObject
{
    public int id { get; set; }
    public string name { get; set; }
}

А также желательно использовать PascalCase для публичных свойств: Id, Name и имён класса: SomeObject.

Примечание: также обратите внимание на свойство ValueMember комбобокса.

READ ALSO
Рефакторинг кода с#

Рефакторинг кода с#

Подскажите пожалуйста сервисы для онлайн рефакторинга кода на c# и да вообще такие есть??

139
Браузеры не видят идентификатор у блока и не выводят картинку

Браузеры не видят идентификатор у блока и не выводят картинку

Браузеры не видят идентификатор у блока #servimgdisp и не выводят картинку, хотя у рядом стоящих, идентичных, блоков видят и выдаютПробовал менять...

209
Анимированое табло c обратным отсчетом на jQuery [требует правки]

Анимированое табло c обратным отсчетом на jQuery [требует правки]

Вечер добрый! Кто может помочь с задачкой, хочу сделать анимированное табло c обратным отсчетом по клику, на jQuery, но плюс к этому анимацию переворачивающихся...

230
SVG. Задать отступ сверху

SVG. Задать отступ сверху

Как задать отступ сверху (аналог CSS - margin-top), чтобы изображение смещалось от верха к центру?

245