【问题标题】:What is the best method for getting the column index from an datagridview in c#?从 c# 中的 datagridview 获取列索引的最佳方法是什么?
【发布时间】:2014-07-30 15:01:05
【问题描述】:

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; 

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

但如果我使用这个:

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

更新

这是我的测试是一个视觉工作室手表:

测试 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 列类型。

【问题讨论】:

  • 你需要显示你从哪里得到column,那是一个数据表列吗?
  • 您是否对列进行排序会影响其列索引?
  • 我需要将 e.ColumnIndex 与 DataGridView 中的特定列索引进行比较。

标签: c# datagridview


【解决方案1】:

更新#我记错了

索引

获取带区在 DataGridView 控件中的相对位置。 此属性的值不一定与集合中波段的当前视觉位置相对应。例如,如果用户在运行时对 DataGridView 中的列重新排序(假设 AllowUserToOrderColumns 属性设置为 true),则每列的 Index 属性值不会改变。相反,列 DisplayIndex 的值会发生变化。但是,对行进行排序确实会改变它们的索引值。

显示索引

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

更新

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

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

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

既然这已经不碍事了,下一步

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

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,这又是正确的。

我没有发现任何问题。请再次向我们提供您的确切代码、控件...等。仍然缺少一些我们看不到的东西,因为您提供的内容没有问题。

【讨论】:

  • 是的,但我的问题是当我使用 column.Index 或 datagridview.Columns[column.name].Index 时,我在一个测试中得到不同的值,但在其他 datagridview 的其他测试中我得到相同的值使用这两个属性。
  • @Chiro300 您必须向我们展示什么是列。你不是,所以我们不能告诉你为什么。列声明在哪里,你是如何分配的。
  • 列是对象例子:DataGridViewCheckBoxColumn/DataGridViewTextBoxColumn,我用的是DataGridViewTextBoxColumn.Index属性
  • @Chiro300 请更新您的帖子并向我们展示此代码。在上面的代码中,您显示 column.Name ,这意味着 column 在某处声明,并且您正在为其分配一些东西以供使用。我们真的需要看到这个来提供帮助。
【解决方案2】:

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

column.Index;

不指向同一个实例:

datagridview1.Columns[column.name].Index;

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

【讨论】:

  • 是的,但是在 MSDN 描述中定义 column.Index 属性是 datagridview.Columns 列表中的相对位置,因此我想了解 column.Index == datagridview.Columns[column.name ].索引,不是吗?。
  • 显示更多你的代码,显示你在哪里获得/创建column
  • 我在 Visual Studio 的设计视图中创建了列。
  • 看起来一个是数据列,另一个是视图
  • dgv的数据源是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多