获取DatagridviewComboBoxCell的SelectedIndex

sub*_*han 6 c# datagridview datagridcomboboxcolumn winforms

我有一个Winforms应用程序有一个DataGridView.它DataGridView不受数据源的约束.我正在读取一个文本文件,根据文件中的每一行,我将每行的值放在datagrid中.

我的网格中有一列是ComboBoxColumn.它有一系列的项目.

我的目标是将单元格中显示的项目的索引保存到文件中.但是,似乎ComboBoxCell没有SelectedIndex像这样的属性ComboBox.

重要的是要提到我需要知道只有当用户点击"保存"选项时显示的项目的索引,所以我不相信editingControlShowing事件是我的方式去.

TaW*_*TaW 7

嗯,你说对了差不多了吧:为了找到选择的指数,你这样做需要编写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;
 }
Run Code Online (Sandbox Code Playgroud)

现在你可以使用它:

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

请注意,这只是一个最小的例子.如果按"保存"布顿在你的用户将编辑多个列和行,你将需要存储要么ComboBoxes,或者更便宜的SelectedIndex,也许在CellEndEdit在每个小区的基础事件.细胞Tag是明显的储存场所:

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

在这个版本中,你显然会从Tag,而不是从组合中检索索引.

当然,你也可以找到ItemValue这样的:

DataGridViewComboBoxCell dcc = 
                        (DataGridViewComboBoxCell)dataGridView1[yourColumn, yourRow];
int index = dcc.Items.IndexOf(dcc.Value);
Run Code Online (Sandbox Code Playgroud)

但这只会得到第一个拟合指数,而不是实际选择的指数.

  • Tag属性与这些事件相结合,为我提供了所需的解决方案.非常感谢 (2认同)