填写DataSet
后,我将两个DataGridViewComboBoxColumns
插入某个特定索引:
dgvPayments.Columns.Insert(1, cmbPayMethod);
dgvPayments.Columns.Insert(3, cmbPayType);
dgvPayments.Columns.Insert(5, cmbMonth);
我在DataGridView
中有一个单元格点击事件,我在其中检查索引:
if (e.ColumnIndex == 6)
{
...
}
第一次加载数据时,列索引会命中正确的列,但在清除数据之后,列索引不会。有什么问题?
答案 0 :(得分:0)
如果你的设置如此:
DataGridView.DataSource
绑定到集合。Form.Load
中,插入OP中显示的列。"清算数据"包括重新绑定DataSource
。
this.dataGridView.DataSource = emptyDataSource;
然后重新绑定DataSource
基本上删除了源列并读取它们。这会重新调整手动插入的列'索引是第一个 - 但它使DisplayIndex
保持不变。
例如:
// DataSource added.
╔══════════════╦════════════╦════════════╦════════════╗
║ ║ "Source 1" ║ "Source 2" ║ "Source 3" ║
╠══════════════╬════════════╬════════════╬════════════╣
║ Index ║ 0 ║ 1 ║ 2 ║
║ DisplayIndex ║ 0 ║ 1 ║ 2 ║
╚══════════════╩════════════╩════════════╩════════════╝
// Column inserted at index 1.
╔══════════════╦════════════╦════════════╦════════════╦════════════╗
║ ║ "Source 1" ║ "Insert 1" ║ "Source 2" ║ "Source 3" ║
╠══════════════╬════════════╬════════════╬════════════╬════════════╣
║ Index ║ 0 ║ 1 ║ 2 ║ 3 ║
║ DisplayIndex ║ 0 ║ 1 ║ 2 ║ 3 ║
╚══════════════╩════════════╩════════════╩════════════╩════════════╝
// DataSource rebound.
╔══════════════╦════════════╦════════════╦════════════╦════════════╗
║ ║ "Source 1" ║ "Insert 1" ║ "Source 2" ║ "Source 3" ║
╠══════════════╬════════════╬════════════╬════════════╬════════════╣
║ Index ║ 1 ║ 0 ║ 2 ║ 3 ║
║ DisplayIndex ║ 0 ║ 1 ║ 2 ║ 3 ║
╚══════════════╩════════════╩════════════╩════════════╩════════════╝
<强>解决方案:强>
您之前检查索引的位置:
if (e.ColumnIndex == 1) // ==6 in your OP.
你可以改为:
检查该列DisplayIndex
:
if (this.dataGridView.Columns[e.ColumnIndex].DisplayIndex == 1)
或者,更优选地,检查列Name
:
if (this.dataGridView.Columns[e.ColumnIndex].Name == "Insert 1")
检查Name
更可靠,因为它比DisplayIndex
更不可能更改,并且对于未来的开发人员来说更易于维护。