Thomas
Thomas

Reputation: 6690

DevExpress XtraGrid GroupRow, CheckEdit Interactions Possibilities

Currently, I am displaying an XtraGrid that contains Group Rows. I have a "Select All" DevExpress.XtraEditors.CheckEdit control (which is different from this elusive "Select All" check box control I am reading about in the documentation). It is different for a reason: I want the check box to do something other than "Select All" (which comes in only three different varieties according to the DevExpress Docs.).

I want a user to be able to do one of two things with the CheckEdit control. [1] If no Group Rows are expanded, I want to select all Group Rows. [2] If one or more Group Rows are expanded, I only want to select the expanded rows.

Presently, I am able to manipulate the controls to do only one of the two things (see code). My question is twofold: is this possible; and, if so, how would I go about it?

Here is my code that does the second of the two 'things' described above:

'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

As you can see, all this really is just a work around. There is also presumably more overhead than needed in my calling .GetSelectedRows(). I am just attempting to sort through the row types in order to keep the row selected or .UnselectRow()

Upvotes: 0

Views: 1553

Answers (1)

nempoBu4
nempoBu4

Reputation: 6631

You can use GridView.GetRowExpanded method to check whether a specific group row is expanded. For iterating through visible rows you can use GridView.RowCount property. To get row level just use GridView.GetRowLevel method. Also you need to check wether a row is new item row or is filter row by using GridView.IsNewItemRow method and GridView.IsFilterRow method. For all of this methods you need to get Row handle by using GridView.GetVisibleRowHandle method. When you are working with selection is better to use GridView.BeginSelection method and GridView.EndSelection method outside of your code.
UPDATE: If you want to select hidden rows within a collapsed group then you can use GridView.GetChildRowCount method and GridView.GetChildRowHandle method to get all hidden rows.
Here is some sample code that is performing your two things together:

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

Upvotes: 1

Related Questions