Сегодня я решил поведать о подходе реализации 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. Какой подход использовать решать Вам.