使用 using Treeview 控件创建高度可以管理的Treeview 控件

分享于 

9分钟阅读

Web开发

  繁體

介绍

我们都知道微软管理控制台( MMC )的强大功能。 MMC是微软平台管理和系统管理工具的标准。 MMC使你可以使用捕捉ins来管理 Windows的每个部分,甚至可以使用同一标准接口的其他应用程序。 本文的目的是提供一个类似于 Web ( 我称之为 MMC Web )的MMC接口。 MMC网络代表了各种管理任务的公共视图,这将使生活更加轻松。 MMC Web是一个容易附加的框架,使用户可以添加/删除模块以及更少的时间重用。

要求

代码已经使用,TreeView 控件编写,因这里要运行的脚本应该在它的正确的位置。 这些脚本在下载中提供,位于工具文件夹下。 为了确保树视图正常工作,你需要做的就是将webctrl_client文件夹复制到你的IIS目录。

使用代码

现在假设我们想表示一个简单的组织层次结构。 为了深入挖掘,假设有一个公司,下面有一些部门,每个部门都由一些部分组成。 从技术上讲,有三个实体公司,部门和部门,其中部门是公司的孩子,部门是部门的孩子。 现在,为了在树中实现这种形式的结构,最简单的步骤是:

  • 实现 IProvider 接口:创建对象特定的提供程序类( 比如。 CompanyProvider )。这些类将负责从数据源获取特定for的数据。 框架将根据 XML Schema 中定义的层次结构在内部由框架提供。
  • 实现 IRenderer 接口:创建对象特定的渲染器类( 比如。 CompanyRenderer )。这些类将为树提供呈现选项,如树将如何呈现。
  • 构造一个定义对象及其行为类型之间关系的XML。

XML格式如下所示:

<companyassembly="TreeView.Objects"provider="TreeView.Objects.Provider.CompanyProvider"renderer="TreeView.Objects.Renderer.CompanyRenderer"expanded="true"><departmentassembly="TreeView.Objects"provider="TreeView.Objects.Provider.DepartmentProvider"renderer="TreeView.Objects.Renderer.DepartmentRenderer"expanded="true"><sectionassembly="TreeView.Objects"provider="TreeView.Objects.Provider.SectionProvider"renderer="TreeView.Objects.Renderer.SectionRenderer"expanded="false"/></department></company>

每个XML节点包含几个属性,这些属性包括:

  • assembly
  • 定义在哪里可以找到渲染器,提供者和对象。
  • provider
  • 定义提供程序类的对象类型。
  • renderer
  • 定义渲染器类的对象类型。
  • expanded
  • 定义树节点的状态。

所有这些属性都被用来从XML动态构建对象模型。

  • 最后,需要在页面加载时将 ExtendedTreeView 控件( 奇迹控制) 拖动到网页并调用带有适当服务器路径的LoadXml 函数。

一旦加载完成,我们需要在每个选择更改时使用正确的实体 of,我们将在树的右侧加载实体信息。 构建过程中,每个树节点ID由'_'分隔的ID和 Treeview 框架的对象名格式内部构造,这可以解决我们的问题。 选择时,我们只需要从'。'分离的字符串节点ID中获取适当的树节点对象即可。

privatevoid treeView_SelectedIndexChange(object sender, 
 Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
{
 // gets the node id in dot separated format. _NodeID = e.NewNode;
 // load LoadPage( _NodeID );
}

现在,为了显示实体细节,我们可以为实体名称创建控件( 例如: 使用最统一的方法,每个控件都需要扩展 BaseControl 类并实现 IHost 接口。 接口将使控件可以插入 Treeview 框架,在节点of的每个选择变更上,加载控件并使用 IHost 接口加载实体信息。

privatevoid LoadPage( string nodeID )
{
 BaseControl control = null;
 // this line does all tricks of geting real from dot separated node ID TreeNode node = treeView.GetNodeFromIndex( nodeID );
 // make the id string[] nodeParts = node.ID.Split( '_' );
 //save the ids _PropertyID = Int32.Parse( nodeParts[ 1 ] );
 _ControlID = nodeParts[ 0 ];
 control = ( BaseControl ) pnlRenderer.FindControl( _ControlID );
 if( control == null )
 {
 // get the control namestring controlName = "Controls/" + nodeParts [ 0 ] + ".ascx";
 //Control control = LoadControl( controlName ); control = ( BaseControl ) LoadControl( controlName );
 control.ID = _ControlID; 
 if ( control!= null )
 {
 pnlRenderer.Controls.Clear();
 pnlRenderer.Controls.Add( control );
 // bind the events control.PreRender +=new EventHandler(control_PreRender);
 control.OnChange+=new OnChangeEvent(control_OnChange);
 }
 }//if( control == null ) IHost loader = ( IHost ) control; 
 // load the moduleif ( nodeID!= String.Empty )
 {
 loader.LoadTab( _PropertyID );
 }
}

关于框架

就我们所见,Treeview 使用一个简单的XML文件来构建它的对象模型。 接下来,让我们深入了解一下工作是如何完成的。 Treeview 框架使用一个名为 ExtendedTreeView的控件,该控件已经在 on Web TreeView 控件上生成。 它扩展了现有 TreeView 控件的所有功能。 此外,它还提供了一个功能,以最友好的方式构建树。

publicvoid LoadTree( string ServerPath );

如你所见,函数需要一个包含树结构定义的XML文件的服务器路径。 提供了路径之后,它从XML中递归地加载一个对象模型。

源的一部分如下:

private Defination FillObject( XmlNode rootNode )
{
 Assembly ass = Assembly.Load( rootNode.Attributes["assembly"].Value );
 Defination def = new Defination();
 // create the provider objectobject providerObject = 
 Activator.CreateInstance( ass.GetType( 
 rootNode.Attributes["provider"].Value, true ) );
 def.Provider = ( Interface.IProvider ) providerObject;
 // create the renderer objectobject rendererObject = 
 Activator.CreateInstance( ass.GetType( 
 rootNode.Attributes["renderer"].Value, true ) );
 def.Renderer = ( Interface.IRenderer ) rendererObject;
 // will the node be expanded def.IsExpanded = bool.Parse( rootNode.Attributes["expanded"].Value );
 return def; 
}

完成了从XML文件构建对象之后,它使用模型构建树结构。 这个过程是从 root 节点开始构建树,然后从最高级别向下,直到遇到叶子。

publicvoid LoadTree( string serverPath )
{
 Schema schema = new Schema( serverPath );
 Defination defination = schema.RootNode;
 ExecuteDef( defination, 0, null );
}privatevoid ExecuteDef( Defination defination, 
 int parentID, TreeNode parentNode )
{
 IProvider provider = defination.Provider;
 IList list = provider.GetAll( parentID );
 LoadList( list, defination, parentID, parentNode );
}privatevoid LoadList( IList list, Defination def, 
 int parentNodeID, TreeNode parentNode )
{
 foreach( object obj in list )
 {
 IRenderer renderer = def.Renderer;
 renderer.Set( obj );
 TreeNode node = ConstructNode( renderer, parentNodeID );
 PopulateNode( node, parentNodeID, parentNode );
 if( def.IsExpanded )
 {
 LoadNode( renderer, def, node );
 }
 }// end foreach}

最终

MMC网络将帮助用户减少代码行的数量,方法是重用最常见的模块集( 例如。 密码更改,添加新注册,以及其他已经由其他人编写的。 这样可以帮助isv更好地成长。


WEB  MAN  控制  micr  HIG  Microsoft  
相关文章