数据清除后,DataGridViewColumn索引会发生变化

时间:2017-04-25 02:52:42

标签: c# indexing datagridview display

填写DataSet后,我将两个DataGridViewComboBoxColumns插入某个特定索引:

dgvPayments.Columns.Insert(1, cmbPayMethod);
dgvPayments.Columns.Insert(3, cmbPayType);
dgvPayments.Columns.Insert(5, cmbMonth);

我在DataGridView中有一个单元格点击事件,我在其中检查索引:

if (e.ColumnIndex == 6)
{
 ...
}

第一次加载数据时,列索引会命中正确的列,但在清除数据之后,列索引不会。有什么问题?

1 个答案:

答案 0 :(得分:0)

如果你的设置如此:

  1. 在表单构造函数中,将DataGridView.DataSource绑定到集合。
  2. Form.Load中,插入OP中显示的列。
  3. "清算数据"包括重新绑定DataSource

    this.dataGridView.DataSource = emptyDataSource;
    
  4. 然后重新绑定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更不可能更改,并且对于未来的开发人员来说更易于维护。