Получить DatagridviewComboBoxCell SelectedIndex

У меня есть приложение Winforms, которое имеет файл DataGridView. DataGridView не привязан к источнику данных. Я читаю текстовый файл и в соответствии с каждой строкой в ​​файле помещаю значения каждой строки в сетку данных.

У меня есть столбец в моей сетке, который является ComboBoxColumn. В нем есть коллекция предметов.

Моя цель - сохранить в файл индекс элемента, который отображается в ячейке. Однако кажется, что ComboBoxCell не имеет свойства SelectedIndex, такого как ComboBox.

Важно отметить, что мне нужно знать индекс элемента, отображаемого только тогда, когда пользователь нажимает кнопку «Сохранить». Поэтому я не верю, что событие editControlShowing — это мой путь.


person subirshan    schedule 10.05.2015    source источник


Ответы (1)


Что ж, вы поняли почти правильно: чтобы найти выбранный индекс, который вам нужен, нужно закодировать событие EditingControlShowing, просто не забудьте сохранить ссылку на ComboBox, который использовано при редактировании:

  // hook up the event somwhere:
   dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;

 // keep a reference to the editing comtrol:
 ComboBox combo = null;

 // fill the reference, once it is valid:
 void dataGridView1_EditingControlShowing(object sender, 
                                          DataGridViewEditingControlShowingEventArgs e)
 {
     combo = e.Control as ComboBox;
 }

Теперь вы можете использовать его:

private void Save_Click(object sender, EventArgs e)
{
        int index = -1;
        if (combo != null) index = combo.SelectedIndex;
        // now do what you want..
}

Обратите внимание, что это всего лишь минимальный пример. Если ваши пользователи будут редактировать несколько столбцов и строк, прежде чем они нажмут кнопку «Сохранить», вам нужно будет сохранить либо ComboBoxes, либо, что дешевле, SelectedIndex, возможно, в событии CellEndEdit для каждой ячейки. Ячейки Tag являются очевидными местами хранения:

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
   if (combo != null) 
       dataGridView1[e.ColumnIndex, e.RowIndex].Tag = combo.SelectedIndex;
}

В этой версии вы, очевидно, получите индекс из Tag, а не из комбо..

Конечно, вы также можете найти Item из Value вот так:

DataGridViewComboBoxCell dcc = 
                        (DataGridViewComboBoxCell)dataGridView1[yourColumn, yourRow];
int index = dcc.Items.IndexOf(dcc.Value);

Но это просто даст первый подходящий индекс, а не тот, который был фактически выбран.

person TaW    schedule 10.05.2015
comment
Свойство Tag в сочетании с этими событиями дало мне необходимое решение. Большое спасибо - person subirshan; 11.05.2015