我有一个包含一些列的DataGridView - 一些是自动添加的,一些是在用户执行某个操作时添加的。某些自动生成的列不可见,可见列已冻结且只读。从用户添加的可见列中,用户可以对这些列进行重新排序,然后我会在代码中使用这些列的顺序。
自动生成的列属于自定义类型DataGridViewUnincludedMetadataColumn
,用户生成的列为普通DataGridViewColumns
。
问题:
我正在尝试获取DataGridViewColumn[]
(称为orderedColumnList
) 用户生成的可见列。
我使用此代码计算自动生成的可见列数:
int unincludedVisibleColumnCount = 0;
foreach (var unincludedCol in dataGridView_Metadata.Columns.OfType<DataGridViewUnincludedMetadataColumn>())
{
if (unincludedCol.Visible)
{
unincludedVisibleColumnCount++;
}
}
我使用此代码获取orderedColumnList:
foreach (DataGridViewColumn col in dataGridView_Metadata.Columns)
{
if (col.GetType() != typeof(DataGridViewUnincludedMetadataColumn))
{
//if the column is going to be visible
//add the column to the orderedcolumnlist
orderedColumnList[col.DisplayIndex - unincludedVisibleColumnCount] = col;
}
}
问题是DisplayIndex似乎与每列显示的实际索引不匹配。
在我的测试中,我得到了这个:
Index | DisplayIndex | Where the column actually is in the display
0 | 0 | 0
1 | 1 | 1
2 | 4 | n/a - Visible == false
3 | 6* | 5*
4 | 3 | 3
5 | 2 | 2
6 | 5* | 4*
最初我认为这只是关闭的最后一列,但后来我通过添加另一个用户生成的列进行了测试,它将最后两列排除了一个,所以我很困惑这里的模式是什么可能。
为什么星号值不同,如何在我的代码中检查?
答案 0 :(得分:0)
我现在已经想到了这一点,感谢@ stuartd的评论,代码如下。这使用DataGridViewColumnCollection对象上的GetFirstColumn()和GetNextColumn()方法以及DataGridViewElementStates.Visible。
List<DataGridViewColumn> orderedColumnList = new List<DataGridViewColumn>();
DataGridViewColumn firstCol = dataGridView_Metadata.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
DataGridViewColumn nextCol = dataGridView_Metadata.Columns.GetNextColumn(firstCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
while (nextCol != null)
{
if (nextCol.GetType() != typeof(DataGridViewUnincludedMetadataColumn))
{
orderedColumnList.Add(nextCol);
}
nextCol = dataGridView_Metadata.Columns.GetNextColumn(nextCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
}