Vb.net DevExpress XtraGrid GroupRow,选中编辑交互可能性

Vb.net DevExpress XtraGrid GroupRow,选中编辑交互可能性,vb.net,devexpress,xtragrid,Vb.net,Devexpress,Xtragrid,目前,我正在显示一个包含组行的XtraGrid。我有一个“全选”DevExpress.XtraEditors.CheckEdit控件(它不同于我在文档中阅读的这个难以捉摸的“全选”复选框控件)。它的不同有一个原因:我希望该复选框可以执行“全选”以外的操作(根据DevExpress文档,全选只有三种不同的类型) 我希望用户能够使用CheckEdit控件执行以下两项操作之一。[1] 如果未展开任何组行,我希望选择所有组行。[2] 如果展开一个或多个组行,我只想选择展开的行 目前,我能够操纵控件只做这

目前,我正在显示一个包含组行的XtraGrid。我有一个“全选”DevExpress.XtraEditors.CheckEdit控件(它不同于我在文档中阅读的这个难以捉摸的“全选”复选框控件)。它的不同有一个原因:我希望该复选框可以执行“全选”以外的操作(根据DevExpress文档,全选只有三种不同的类型)

我希望用户能够使用CheckEdit控件执行以下两项操作之一。[1] 如果未展开任何组行,我希望选择所有组行。[2] 如果展开一个或多个组行,我只想选择展开的行

目前,我能够操纵控件只做这两件事中的一件(参见代码)。我的问题有两个:这可能吗;如果是的话,我该怎么做呢

下面是我的代码,它完成了上述两个“事情”中的第二个:

'If the CheckEdit control is checked:  

xtraGrid.SelectAll()

Dim rowHandles() As Int32 = xtraGrid.GetSelectedRows()  

If rowHandles.Count > 0 Then
    For Each RowHandle As Int32 In rowHandles
        If xtraGrid.IsGroupRow(RowHandle) Then
            xtraGrid.UnselectRow(RowHandle)
        End If
    Next
End If
正如你所看到的,所有这一切实际上只是一种变通。在调用
.GetSelectedRows()
时,可能会有比所需更多的开销。我只是尝试对行类型进行排序,以保持行处于选中状态,或者
.unelectrow()

您可以使用方法检查特定的组行是否已展开。对于遍历可见行,可以使用属性。要获得行级别,只需使用方法。您还需要使用method和method检查行是新项目行还是筛选行。对于所有这些方法,您需要通过使用方法获得
行句柄
。使用选择时,最好使用代码之外的方法和方法。
更新:如果要选择折叠组中的隐藏行,则可以使用方法和方法获取所有隐藏行。
下面是一些同时执行两件事情的示例代码:

Private Sub SomeSub

    If xtraGrid.GroupCount = 0 Then
        xtraGrid.SelectAll()

        Exit Sub
    End If

    xtraGrid.BeginSelection()
    xtraGrid.ClearSelection()

    Dim isExpanded As Boolean = False

    For rowVisibleIndex = 0 To xtraGrid.RowCount - 1
        Dim rowHandle As Integer = xtraGrid.GetVisibleRowHandle(rowVisibleIndex)

        If xtraGrid.IsNewItemRow(rowHandle) Then
            Continue For
        End If

        Dim level As Integer = xtraGrid.GetRowLevel(rowHandle)

        If level = 0 Then
            If Not isExpanded Then
                isExpanded = xtraGrid.GetRowExpanded(rowHandle)

                If isExpanded Then
                    xtraGrid.ClearSelection()
                Else
                    xtraGrid.SelectRow(rowHandle)
                End If
            End If
        Else
            xtraGrid.SelectRow(rowHandle)

            'Update: select hidden rows
            If xtraGrid.IsGroupRow(rowHandle) And Not xtraGrid.GetRowExpanded(rowHandle) Then
                SelectRowHierarchy(rowHandle)
            End If
        End If
    Next

    xtraGrid.EndSelection()

End Sub

Private Sub SelectRowHierarchy(rowHandle As Integer)

    Dim childCount As Integer = xtraGrid.GetChildRowCount(rowHandle)

    For childIndex As Integer = 0 To childCount - 1

        Dim childRowHandle As Integer = xtraGrid.GetChildRowHandle(rowHandle, childIndex)

        xtraGrid.SelectRow(childRowHandle)

        If xtraGrid.IsGroupRow(childRowHandle) Then
            SelectRowHierarchy(childRowHandle)
        End If
    Next

End Sub

这样做的最大问题是,如果可能的行不可见,即被显示网格的上下文(窗口)隐藏,这是您提出的一个很好的解决方案。信不信由你-我认为这是
.isVisible()
东西的最大缺陷-如果该行实际上不可见,那么它就不能被选中或可操作。@Thomas In DevExpress如果指定的行隐藏在折叠的组中,那么该行就不可见。否则,该行将被视为可见。可以使用方法检查行的可见性。是否只选择当前在用户屏幕中可见的行?或者,您想选择隐藏在折叠组中的行?理想情况下,我希望根据您的定义选择当前“可见”的所有行。让我再玩一会儿。我想知道我用来托管网格的控件是否改变了一些功能。好吧,那么你的方法,除了
if xtraGrid.GroupCount
位之外,基本上完成了我的功能,如上所述。这是好的,因为从概念上讲,我们在同一页上(有点-我们所做的肯定是不同的,这很好)。让我稍微细化一下最初的问题:能够选择所有可见行,那么,如何选择所有隐藏行
.SelectAll()
对折叠的组行仅返回组下的第一行。@您可以使用
GridView.GetChildRowCount
方法和
GridView.GetChildRowHandle
方法。看看我答案中的更新。