C#: DisplayMember и ValueMember

Сегодня я решил поведать о подходе реализации HTML селекта в таком элементе как DataGridViewComboBoxColumn. Другими словами, я расскажу как реализовать в DataGridViewComboBoxColumn отображение данных с привязкой определенных значений к отображаемому тексту.

О реализации данного подхода для элементов ComboBox или ListView можно почитать тут HTML select в C#.
В целом подход к реализации данной задачи так же опирается на создание класса, который будет определять хранящееся значение в списке. Однако в данном случае переопределение метода ToString() не потребуется. Однако потребуется реализовать несколько геттеров.

class DataStruct
    {
        private string _Id = String.Empty;
        private string _Text = String.Empty;

        public string Id { get { return this._Id; } }
        public string Text { get { return this._Text; } }

        public DataStruct(string id, string text)
        {
            this._Id = id;
            this._Text = text;
        }
    }

Теперь добавим пару объектов нашего класса в колонку с типом DataGridViewComboBoxColumn.

Column1.Items.Add(new DataStruct("id1", "Текст для id1"));
Column1.Items.Add(new DataStruct("id2", "Текст для id2"));
Column1.Items.Add(new DataStruct("id3", "Текст для id3"));

Теперь обратим внимание на два атрибута нашего Column1: ValueMember и DisplayMember. Два этих атрибута позволяют определить ключевые атрибуты класса, хранящегося в списке значений нашего списка. DisplayMember — определяет атрибут, который будет отображаться в списке пользователю. ValueMember — определят атрибут значения для выбранного текстового представления. В нашем случае нам нужно отображать поле Text, а получать значение поля Id. Таким образом имеем следующее.

Column1.DisplayMember = "Text";
Column1.ValueMember = "Id";
Column1.Items.Add(new DataStruct("id1", "Текст для id1"));
Column1.Items.Add(new DataStruct("id2", "Текст для id2"));
Column1.Items.Add(new DataStruct("id3", "Текст для id3"));

Вот собственно и все. Теперь чтобы получить выбранное значение, нам не нужно будет делать преобразование типов. Достаточно лишь будет обратиться к атрибуту Value ячейки таблицы.

MessageBox.Show(dataGridView1["Column1", 0].Value.ToString());

Так же хочется отметить тот факт, что этот подход можно так же применять и к ComboBox, ListBox и прочим контролам, которые имеют атрибуту ValueMember и DisplayMember. Какой подход использовать решать Вам.

Запись опубликована в рубрике Проще говоря с метками , , , , , . Добавьте в закладки постоянную ссылку.