我的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 |
根据documentation,Add
方法将返回添加列的索引。由于索引从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,即使它位于网格列的右侧?
答案 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
}
}