在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:
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列类型。
答案 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()
值。