Vb.net DevExpress XtraGrid GroupRow,选中编辑交互可能性
目前,我正在显示一个包含组行的XtraGrid。我有一个“全选”DevExpress.XtraEditors.CheckEdit控件(它不同于我在文档中阅读的这个难以捉摸的“全选”复选框控件)。它的不同有一个原因:我希望该复选框可以执行“全选”以外的操作(根据DevExpress文档,全选只有三种不同的类型) 我希望用户能够使用CheckEdit控件执行以下两项操作之一。[1] 如果未展开任何组行,我希望选择所有组行。[2] 如果展开一个或多个组行,我只想选择展开的行 目前,我能够操纵控件只做这两件事中的一件(参见代码)。我的问题有两个:这可能吗;如果是的话,我该怎么做呢 下面是我的代码,它完成了上述两个“事情”中的第二个:Vb.net DevExpress XtraGrid GroupRow,选中编辑交互可能性,vb.net,devexpress,xtragrid,Vb.net,Devexpress,Xtragrid,目前,我正在显示一个包含组行的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
方法。看看我答案中的更新。