DataGridView_CellClick事件args正在使用奇怪的列索引

时间:2015-08-12 16:04:05

标签: c# winforms datagridview

我的WinForms应用程序中有一个DataGridView,我使用数据绑定填充:

myGridView.DataSource = myDataList;

一旦绑定了列表,我就在DataGridView的末尾(右侧)添加了一个DataGridViewButtonColumn。我在DataBindingComplete事件中处理这个:

private void myGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    if (!myGridView.Columns.Contains("Remove"))
    {
        DataGridViewButtonColumn removeColumn = new DataGridViewButtonColumn();
        removeColumn.Name = "Remove";
        removeColumn.HeaderText = "Remove";
        removeColumn.DataPropertyName = "Remove";
        removeColumn.Text = "Remove";
        removeColumn.UseColumnTextForButtonValue = true;
        _removeColumnIndex = myGridView.Columns.Add(removeColumn);
    }
}

最后,我的DataGridView包含以下列:

| Date | Quantity | Cumulative Quantity | Rejected | Cumulative Rejected | Remove |

根据documentationAdd方法将返回添加列的索引。由于索引从0开始,从左到右,因此remove列的索引应为5.使用调试器,我已验证_removeColumnIndex实际上等于5。

奇怪的行为发生在CellClick事件中:

private void myGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
   if(e.ColumnIndex == _removeColumnIndex)
   {
      // Remove row
   }
}

当我单击我的删除按钮时,该行未被删除。使用调试器,我发现当我单击删除按钮时e.ColumnIndex的值为0.因为它不等于5,所以不会发生删除。我在所有其他列上使用了调试器;从左到右的顺序是:1,2,3,4,5,0。

为什么myGridView.Columns.Add()方法返回正确的索引5,但DataGridViewCellEventArgs将该列视为索引0,即使它位于网格列的右侧?

1 个答案:

答案 0 :(得分:1)

列的索引已更改,因为DataGridView的DataSource在CellClick事件被触发之前已更新(重置)

我假设其他列是由DataGridView生成的(您有DataGridView.AutoGenerateColumns = true

因此,在完成绑定并生成列后,您添加了Remove列 重置DataSource后,生成的列被删除并再次生成,
但您手动添加的列仍然存在并获得index = 0(第一列)

使用列名检查CellClick事件处理程序

中的列
private void myGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;   
    if(dgv.Columns(e.ColumnIndex).Name.Equals("Remove") == true)
    {
       // Remove row
    }
}