【问题标题】:DevExpress XtraGrid GroupRow, CheckEdit Interactions PossibilitiesDevExpress XtraGrid GroupRow,CheckEdit 交互可能性
【发布时间】:2014-09-16 14:40:30
【问题描述】:

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

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

目前,我只能操纵控件来做两件事中的一件(参见代码)。我的问题是双重的:这可能吗?如果是这样,我该怎么做?

这是我的代码,用于完成上述两个“事情”中的第二个:

'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() 中,大概也有比需要更多的开销。我只是试图对行类型进行排序以保持选中行或.UnselectRow()

【问题讨论】:

    标签: vb.net devexpress xtragrid


    【解决方案1】:

    您可以使用GridView.GetRowExpanded 方法检查特定组行是否展开。要遍历可见行,您可以使用 GridView.RowCount 属性。要获得行级别,只需使用GridView.GetRowLevel 方法。您还需要使用GridView.IsNewItemRow 方法和GridView.IsFilterRow 方法检查一行是新项目行还是过滤行。对于所有这些方法,您需要使用GridView.GetVisibleRowHandle 方法获取Row handle。当您使用选择时,最好在代码之外使用 GridView.BeginSelection 方法和 GridView.EndSelection 方法。
    更新:如果您想选择折叠组中的隐藏行,那么您可以使用GridView.GetChildRowCount 方法和GridView.GetChildRowHandle 方法获取所有隐藏行。
    以下是一些示例代码,它们一起执行您的两件事:

    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 在 DevExpress 中,如果指定行隐藏在折叠组中,则该行不可见。否则,该行被认为是可见的。您可以使用GridView.GetVisibleIndex 方法检查行可见性。您是否只想选择当前在用户屏幕中可见的那些行?或者您想选择隐藏在折叠组中的行?
    • 我会 - 理想情况下 - 喜欢根据您的定义选择当前“可见”的所有行。让我多玩一点。我想知道我用来承载网格的控件是否稍微改变了功能。
    • 好的,所以你的方法,除了If xtraGrid.GroupCount 位,基本上完成了我的工作,上面。这很好,因为从概念上讲我们在同一页面上(有点 - 我们正在做的事情肯定是不同的,这很好)。让我稍微细化一下最初的问题:能够选择所有可见的行,那么,我如何选择所有隐藏的行? .SelectAll() 在折叠组行上仅返回组下的第一行。
    • @Thomas 您可以使用GridView.GetChildRowCount 方法和GridView.GetChildRowHandle 方法。查看我的答案中的更新。
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多