从c#中的datagridview获取列索引的最佳方法是什么?

时间:2014-07-30 15:01:06

标签: c# datagridview

在C#中获取datagridview列的索引有不同的方法,例如:

dataGridViewTextBoxColumn1.Index; 
dataGridViewTextBoxColumn1.DisplayIndex; 
datagridview1.Columns[column.name].Index;
datagridview1.Columns[column.name].DisplayIndex;

dataGridViewTextBoxColumn1位于DataGridViewColumnsCollection列表中。

Desingner代码:

this.datagridview1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.dataGridViewTextBoxColumn1,
            this.dataGridViewTextBoxColumn2,
            this.dataGridViewTextBoxColumn3
            }

我遇到了不同的方法,但在奇怪的情况下,我获得了不同的值,例如我使用它:

datagridview1.Columns[dataGridViewTextBoxColumn1.name].Index; 

我得到了相对于列集合的真实索引,在我的测试中,值为3。

但如果我使用它:

dataGridViewTextBoxColumn1.Index; 

我得到一个不同的索引,在我的测试中,值为1。

我不明白,因为理论上属于同一属性,不是吗?

如果是displayindex属性,结果类似。在我的datagridview中,我有隐形和只读列。

在其他测试中,我得到了所有情况的正确值,并且此datagridivew包含更多可见和不可见的列。

我的问题是:如果我使用事件,那么获取DataGridView中列的正确索引的最佳方法是什么,例如CellContentClick来均衡DataGridViewCellEventArgs.ColumnIndex?

示例:

private void datagridview1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0 && e.ColumnIndex.Equals(datagridview1.Columns[dataGridViewTextBoxColumn1.Name].Index))
        datagridview1.Rows[e.RowIndex].Cells[dataGridViewTextBoxColumn2.Index].Value = true;
}

更新

这是我的测试是一个视觉工作室观看:

测试1:

enter image description here

 private void dgvTerminales_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex.Equals(dgvTerminales.Columns[clmActiva.Name].Index))
                dgvTerminales.Rows[e.RowIndex].Cells[clmEditado.Index].Value = true;
        }

测试2:

具有相同属性,列和表单的其他datagridview。

enter image description here

private void dgvSucursales_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex.Equals(dgvSucursales.Columns[clmActiva.Name].Index))
                dgvSucursales.Rows[e.RowIndex].Cells[0].Value = true;
        }

clmActiva是DataGridViewCheckBoxColumn列类型。

2 个答案:

答案 0 :(得分:1)

更新#我丢失了计数

索引

  

获取DataGridView控件中band的相对位置。   此属性的值不一定对应于集合中乐队的当前视觉位置。例如,如果用户在运行时重新排序DataGridView中的列(假设AllowUserToOrderColumns属性设置为true),则每列的Index属性的值不会更改。而是,DisplayIndex列值更改。但是,对行进行排序会改变其索引值。

的DisplayIndex

  

获取或设置列相对于当前显示列的显示顺序。   与Index属性不同,DisplayIndex属性对应于用户界面(UI)显示的列的当前位置。默认情况下,每列的DisplayIndex都设置为递增顺序的数字,这反映了它们的添加顺序。 Visible属性值不会影响DisplayIndex值。

<强>更新

好吧所以看来OP遗漏了他的确切代码,这使得接下来无法提供帮助,但是在这个帖子中的所有评论之后,这是我的下一组结果。

OP正在使用DataGridViewCheckBoxColumn,所以实际上通过使用CellContentClick这不是不正确的。更改CheckBox值将正确触发此事件。

触发事件的顺序将遵循CellClick,CellContentClick

现在已经不在了,下一步

如果没有您的确切代码并尝试将其拼凑在一起,我有以下内容。 (注意,因为我在设计器中更改了这些名称,如果您尝试在UI中编辑它会导致问题,但我匹配OP提供的内容,因此只要在designer.cs中调整它们就可以正常工作lol。视觉设计师你会试着用这些名字大喊大叫)

this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewCheckBoxColumn();
this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn();

this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewCheckBoxColumn1,
this.dataGridViewTextBoxColumn2,
this.dataGridViewTextBoxColumn3});

所以我的DataGridView有1个CheckBox和2个文本列

当我单击第一列并且复选框正确时,

下面将所有值都注册为0。该事件不会在TextBox列上触发。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    int a = e.ColumnIndex;
    int b = dataGridView1.Columns[dataGridViewCheckBoxColumn1.Name].Index;
    int c = dataGridViewCheckBoxColumn1.Index;

    if (e.RowIndex >= 0 && e.ColumnIndex.Equals(dataGridView1.Columns[dataGridViewCheckBoxColumn1.Name].Index))
        dataGridView1.Rows[e.RowIndex].Cells[dataGridViewTextBoxColumn2.Index].Value = true;
}

当我将CheckBox的位置更改为网格中的第二列而不是第一列时。然后上面的值再次注册为全1,再次正确。

我没有看到任何问题。请再次向我们提供您的确切代码,控件等。由于您提供的内容不存在任何问题,我们仍然可以看到遗漏的内容。

答案 1 :(得分:0)

显然(如果你得到不同的结果),

column.Index;

未指向同一个实例:

datagridview1.Columns[column.name].Index;

要证明它显示两者的.GetHashCode()值。