商信互联
所述的TreeList编辑模块被设计成由表示的显示信息的列表视图的树形结构。为此,在ASP.NET和WinForms应用程序中使用ASPxTreeList和Tree List控件(来自ASPxTreeList和XtraTreeList库)。这些控件提供了数据表示功能,例如对多个列排序数据值,计算和显示摘要值,节点预览,节点图像,运行时列自定义,格式化列和摘要值,使用高级编辑器显示和编辑单元格值等。
要使用ASPxTreeList和TreeList控件,TreeList编辑器模块提供ASPxTreeListEditor和TreeListEditor用于显示列表视图。这些列表编辑器的对象是实现业务类库中ITreeNode接口的对象。此外,TreeList编辑器模块支持分类的树视图,其中树节点代表具有相关项目的类别。为此,提供了CategorizedListEditor。该编辑器的目标是由实现ICategorizedItem接口的对象表示的类别项目。
本主题详细介绍了使用TreeList编辑器模块的基础知识。
TreeList编辑器模块包含三个模块项目:TreeListEditorsModuleBase,TreeListEditorsAspNetModule和TreeListEditorsWindowsFormsModule。您可以添加TreeListEditorsAspNetModule到ASP.NET应用程序和TreeListEditorsWindowsFormsModule的WinForms应用程序。为此,调用“应用程序设计器”并将“ TreeList编辑器”模块从“工具箱”拖到“模块”面板。在Designer中进行更改后,请确保重新生成解决方案。
使用解决方案向导创建新的XAF解决方案时,可以将模块添加到应用程序中。为此,请在“选择其他模块”步骤中选择模块。
要在UI中以树状结构显示数据,请在适当的业务类中实现ITreeNode接口。
public interface ITreeNode {
string Name { get; }
ITreeNode Parent { get; }
IBindingList Children { get; }
}
Public Interface ITreeNode
ReadOnly Property Name() As String
ReadOnly Property Parent() As ITreeNode
ReadOnly Property Children() As IBindingList
End Interface
该ITreeNode.Name属性指定的树节点标题。所述ITreeNode.Parent属性指的是父对象(树节点)。如果将此属性设置为null(在VB中为Nothing),则该对象表示根对象(根树节点)。该ITreeNode.Children属性表示子对象的集合(子树节点)。
要查看ITreeNode接口实现的示例,请参阅使用ITreeNode接口显示树列表主题。
该业务类库提供的HCategory类,它实现了ITreeNode接口。您可以按原样使用它或从中继承它,而不是从头开始实现ITreeNode接口。有关详细信息,请参阅“使用HCategory类显示树列表”主题。若要查看HCategory类的实现,请参考%PROGRAMFILES(x86)%\ DevExpress 19.2 \ Components \ Sources \ DevExpress.Persistent \ DevExpress.Persistent.BaseImpl文件夹,您将在其中找到HCategory.cs文件。
如果层次结构包含无法从“列表视图”对象类型分配的类型的对象,则TreeListEditor和CategorizedListEditor无法正确显示树(请参见Type.IsAssignableFrom)。
将TreeListEditors模块添加到应用程序后,默认情况下,所有表示ITreeNode对象的列表视图都通过ASPxTreeListEditor和TreeListEditor显示。此编辑器从IViewNode.Parent属性设置为null的列表视图对象构建根节点(在VB中为Nothing)。展开节点时,此编辑器将查找节点的ITreeNode.Children集合中包含的列表视图的对象。找到的对象显示为子节点。下图显示了ASPxTreeListEditor和TreeListEditor。
要支持节点图像,请在实现ITreeNode接口的类中实现ITreeNodeImageProvider接口。结果,每个节点将伴随有图像。
所述ITreeNodeImageProvider声明了一个部件-该ITreeNodeImageProvider.GetImage方法。在此方法中,返回与树节点相对应的图像。
要查看ITreeNodeImageProvider接口实现的示例,请参考“树列表”中的“节点图像”主题。
在大多数情况下,树节点表示可以具有相关项目的类别。可以根据Category-Items场景实现以下业务模型。根类别由ProjectGroup类的对象表示(“ .Net”,“ VCL”,...)。此类别的子类别由项目类型对象(“ XtraGrid”,“ XtraEditors”,“ QuantumGrid”等)表示。在此层次结构中可能会有更多级别。例如,每个项目可以包含自己的区域列表:“列”,“ RepositoryItems”,“ MaskEdit”等。这些对象应实现ITreeNode界面以树状显示。同时,可能存在与特定类别(与ProjectGroup,Project或ProjectArea)相关的Issue对象。换句话说,每个类别都通过一对多关系与“发布”对象相关。显示“问题列表视图”时,您可能需要查看类别树和与当前所选类别相关的“问题”对象列表,如下图所示。
此图像演示Windows窗体CategorizedListEditor如何显示“问题列表”视图。如上定义,TreeList编辑器模块为方案提供此列表编辑器。它显示了表示ICategorizedItem类型的对象的列表视图,因此,上例中的Issue类应实现ICategorizedItem接口。
public interface ICategorizedItem {
ITreeNode Category { get; set; }
}
Public Interface ICategorizedItem
Property Category() As ITreeNode
End Interface
要学习如何实现上面定义的示例,请参考“分类列表”主题。
不必通过CategorizedListEditor显示问题列表视图。例如,您可以将普通的GridListEditor用于嵌套的“问题列表”视图。为此,请执行以下操作。
右键单击视图节点,然后选择添加... | 调用的上下文菜单中的ListView。
您可以自定义TreeListEditor和CategorizedListEditor列表编辑器,或通过列表编辑器的ListEditor.Control属性公开的TreeList控件。要使用代码访问列表编辑器,请创建一个View Controller并处理其ViewController.ViewControlsCreated事件,或重写OnViewControlsCreated受保护的方法。以下代码段说明了这一点。
using DevExpress.ExpressApp.TreeListEditors.Win;
using DevExpress.XtraTreeList;
using DevExpress.Persistent.Base.General;
//...
public partial class TreeListController : ViewController {
public TreeListController() {
TargetViewType = ViewType.ListView;
TargetObjectType = typeof(ITreeNode);
}
protected override void OnViewControlsCreated() {
base.OnViewControlsCreated();
ListView view = (ListView)View;
TreeListEditor listEditor = (TreeListEditor)view.Editor;
TreeList treeList = listEditor.TreeList;
// Access TreeList object here.
}
}
Imports DevExpress.ExpressApp.TreeListEditors.Win
Imports DevExpress.XtraTreeList
Imports DevExpress.Persistent.Base.General
'...
Partial Public Class TreeListController
Inherits ViewController
Public Sub New()
TargetViewType = ViewType.ListView
TargetObjectType = GetType(ITreeNode)
End Sub
Protected Overrides Sub OnViewControlsCreated()
MyBase.OnViewControlsCreated()
Dim view As ListView = CType(View, ListView)
Dim listEditor As TreeListEditor = CType(view.Editor, TreeListEditor)
Dim treeList As TreeList = listEditor.TreeList
' Access TreeList object here.
End Sub
End Class
using DevExpress.ExpressApp.TreeListEditors.Win;
using DevExpress.XtraTreeList;
using DevExpress.Persistent.Base.General;
//...
public partial class CategorizedListController : ViewController {
public CategorizedListController() {
TargetViewType = ViewType.ListView;
TargetObjectType = typeof(ICategorizedItem);
}
protected override void OnViewControlsCreated() {
ListView view = (ListView)View;
CategorizedListEditor listEditor = (CategorizedListEditor)view.Editor;
ListView categoriesListView = listEditor.CategoriesListView;
TreeListEditor treeListEditor = (TreeListEditor)categoriesListView.Editor;
TreeList treeList = treeListEditor.TreeList;
// Do what you want with the tree list
}
}
Imports DevExpress.ExpressApp.TreeListEditors.Win
Imports DevExpress.XtraTreeList
Imports DevExpress.Persistent.Base.General
'...
Partial Public Class CategorizedListController
Inherits ViewController
Public Sub New()
TargetViewType = ViewType.ListView
TargetObjectType = GetType(ICategorizedItem)
End Sub
Protected Overrides Sub OnViewControlsCreated()
Dim view As ListView = CType(View, ListView)
Dim listEditor As CategorizedListEditor = CType(view.Editor, CategorizedListEditor)
Dim categoriesListView As ListView = listEditor.CategoriesListView
Dim treeListEditor As TreeListEditor = CType(categoriesListView.Editor, TreeListEditor)
Dim treeList As TreeList = treeListEditor.TreeList
' Do what you want with the tree list
End Sub
End Class
由于控制器是在模块中实现的,因此将对TreeList编辑器模块的引用添加到所需的模块。您还需要设置对DevExpress.XtraTreeList.v 19.2 .dll程序集的引用。
为了过滤树列表,XAF仅将ListView.CollectionSource过滤条件(CollectionSourceBase.Criteria)应用于树列表的根对象。子集合不会被处理,因为它们存储在ITreeNode.Children属性中,并且与根集合源无关。
列表视图树列表控件-TreeList和ASPxTreeList-提供高级筛选功能。例如,控件支持过滤运算符,并且可以过滤根对象和子对象。请点击以下链接以获取更多信息:
以下资源演示了如何在XAF应用程序中使用这些功能:
如果在服务器端进行了更改,则XAF ASPxTreeList集成代码不能立即显示布尔属性的新值。例如,如果新值被某个操作更改了,则该新值不会立即显示(需要刷新页面)。为避免此限制,请使用以下代码。
using DevExpress.Web.ASPxTreeList;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.TreeListEditors.Web;
// ...
public class RemoveTreeListDataCellTemplateController : ViewController {
public RemoveTreeListDataCellTemplateController() : base() { }
protected override void OnActivated() {
base.OnActivated();
ListView listView = View as ListView;
if (listView != null && listView.Editor != null) {
listView.Editor.ControlsCreated = Editor_ControlsCreated;
}
}
void Editor_ControlsCreated(object sender, EventArgs e) {
ASPxTreeListEditor treeListEditor = sender as ASPxTreeListEditor;
if (treeListEditor != null) {
TreeListDataColumn column =
treeListEditor.TreeList.Columns["BoolProperty"] as TreeListDataColumn;
if (column != null) {
column.DataCellTemplate = null;
}
}
}
}
Imports DevExpress.Web.ASPxTreeList
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.TreeListEditors.Web
' ...
Public Class RemoveTreeListDataCellTemplateController
Inherits ViewController
Public Sub New()
MyBase.New()
End Sub
Protected Overrides Sub OnActivated()
MyBase.OnActivated()
Dim listView As ListView = TryCast(View, ListView)
If listView IsNot Nothing AndAlso listView.Editor IsNot Nothing Then
AddHandler listView.Editor.ControlsCreated, AddressOf Editor_ControlsCreated
End If
End Sub
Private Sub Editor_ControlsCreated(ByVal sender As Object, ByVal e As EventArgs)
Dim treeListEditor As ASPxTreeListEditor = TryCast(sender, ASPxTreeListEditor)
If treeListEditor IsNot Nothing Then
Dim column As TreeListDataColumn = TryCast(treeListEditor.TreeList.Columns("BoolProperty"), TreeListDataColumn)
If column IsNot Nothing Then
column.DataCellTemplate = Nothing
End If
End If
End Sub
End Class
使用此代码,ASPxTreeList控件将使用TreeListDataColumn显示布尔值。有关详细信息,请参见TreeListDataColumn.DataCellTemplate。