重新排序DataGridView中的列,然后使用隐藏列读取DisplayIndex

时间:2018-01-05 15:16:09

标签: c# datagridview

我有一个包含一些列的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*

最初我认为这只是关闭的最后一列,但后来我通过添加另一个用户生成的列进行了测试,它将最后两列排除了一个,所以我很困惑这里的模式是什么可能。

为什么星号值不同,如何在我的代码中检查?

1 个答案:

答案 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);
}