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

在c#中,从datagridview获取列索引的最佳方法是什么?,c#,datagridview,C#,Datagridview,获取C#中datagridview列的索引有不同的方法,例如: dataGridViewTextBoxColumn1.Index; dataGridViewTextBoxColumn1.DisplayIndex; datagridview1.Columns[column.name].Index; datagridview1.Columns[column.name].DisplayIndex; dataGridViewTextBoxColumn1位于DataGridViewColumnsCo

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

dataGridViewTextBoxColumn1.Index; 
dataGridViewTextBoxColumn1.DisplayIndex; 
datagridview1.Columns[column.name].Index;
datagridview1.Columns[column.name].DisplayIndex;
dataGridViewTextBoxColumn1位于DataGridViewColumnsCollection列表中

设计人员代码:

this.datagridview1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.dataGridViewTextBoxColumn1,
            this.dataGridViewTextBoxColumn2,
            this.dataGridViewTextBoxColumn3
            }
我经历了不同的方法,但在奇怪的情况下,我获得了不同的值,例如,我使用以下方法:

datagridview1.Columns[dataGridViewTextBoxColumn1.name].Index; 
dataGridViewTextBoxColumn1.Index; 
我得到了相对于列集合的实际索引,在我的测试中,值是3

但如果我用这个:

datagridview1.Columns[dataGridViewTextBoxColumn1.name].Index; 
dataGridViewTextBoxColumn1.Index; 
我得到一个不同的索引,在我的测试中,值是1

我不明白,因为理论上是相同的属性,不是吗

对于displayindex属性,结果类似。在datagridview中,我有不可见列和只读列

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

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

例如:

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;
}
更新

这是我的测试,是visual studio手表:

测试1:

 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

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类型

更新#我数不清了

索引

获取带区在DataGridView控件中的相对位置。 此属性的值不一定对应于集合中标注栏的当前可视位置。例如,如果用户在运行时对DataGridView中的列重新排序(假设AllowUserToOrderColumns属性设置为true),则每个列的Index属性的值不会更改。相反,列DisplayIndex值会更改。但是,对行进行排序会更改它们的索引值

显示索引

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

更新

好吧,看来OP遗漏了他的确切代码,这使得这几乎不可能有帮助,但是在这个线程中的所有注释之后,下面是我的下一组结果

OP使用的是DataGridViewCheckBoxColumn,因此事实上,通过使用CellContentClick,这是正确的。更改复选框值将正确触发此事件

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

现在这已经不碍事了,下一步

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

因此,我的DataGridView有1个复选框和2个文本列

当我用复选框单击第一列时,下面将所有值注册为0,这是正确的。该事件不会在文本框列上触发

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;
}
当我将复选框的位置更改为网格中的第二列而不是第一列时。然后,上述值注册为所有1,再次正确

我看不出有什么问题。请再次向我们提供您的确切代码、控件等。由于您提供的内容没有任何问题,因此我们仍然缺少一些内容。

很明显(如果您得到的结果不同)

未指向与以下对象相同的实例:

datagridview1.Columns[column.name].Index;

为了证明这一点,需要显示两者的
.GetHashCode()
值。

您需要显示从何处获得
,这是一个数据表列吗?您是否对这些列进行排序,从而影响它们的列索引?我需要将e.ColumnIndex与DataGridView中的特定列索引进行比较。是,但我的问题是,当我使用column.Index或datagridview.Columns[column.name].Index时,我在一个测试中得到不同的值,但在另一个使用其他datagridview的测试中,我使用这两个属性得到相同的值。@Chiro300您必须向我们显示列是什么。你不是,所以我们不能告诉你为什么。其中是column声明,如何分配它。该列是对象示例:DataGridViewCheckBoxColumn/DataGridViewTextBoxColumn,我使用DataGridViewTextBoxColumn.Indexproperty@Chiro300请更新您的帖子并向我们显示此代码。在上面的代码中,您显示了column.Name,这意味着列在某个地方被声明,并且您正在为它分配一些东西以供使用。我们确实需要看到这一点来帮助。是的,但是在MSDN描述中定义列。Index属性是datagridview.Columns列表中的相对位置,因此我想了解该列。Index==datagridview.Columns[column.name].Index,不是吗?。显示更多代码,显示获取/创建
列的位置
我在visual studio的“设计”视图中创建了列。看起来一个是数据列,另一个是视图,dgv的数据源是什么?