C#动态生成树型结构的Web程序设计
关键词 c# ;动态;树型;程序设计
许多应用软件的程序设计,我们都希望能像Windows资源管理器那样将其驱动器和其下的文件及文件夹按照层次结构来安排。在C/S条件下这些很容易实现,那么在B/S的Web方式下,我们实现起来就不是特别容易。针对这个问题,在 2002 年,Microsoft? 发布了四种 ASP.NET Web 控件,用于为使用 Microsoft Internet Explorer 的 Web 访问者提供更好的体验。这些 Web 控件称为 Internet Explorer Web 控件,也简称为 IE Web 控件,其中就包含了TreeView Web 控件 ,它就为我们提供了一种按层次结构显示信息的方式。TreeView控件包含了称做“节点”(node)的一些条目的一个列表。每一个节点都可以有自己的节点集合,从而提供了一种更深层的数据定义。每个节点都可以被折叠起来,从而允许访问者在一个TreeView控件中查找,只看他所感兴趣的那一级的数据。就像Windows的资源管理器一样。只不过在使用前要安装IE Web Controls,并配置好运行环境后才能使用,使用Visual Studio .NET,则静态指定 TreeView 结构就像填写几份表格一样简单。
虽然使用 Visual Studio .NET 将静态 TreeNote 添加到 TreeView 的过程非常简单,但通常需要将内容动态地添加到 TreeView 中。例如,您将目录树信息存储到了数据库中,或是正在设计一个资源管理器风格的 Web 应用程序(在此应用程序中,用户可以浏览 Web 服务器的文件系统),这时您可能需要根据服务器的文件夹和文件来动态填充 TreeNote。本文就是使用C#.net语言通过编程方式,配合Oracle数据库实现一种动态的效果,达到动态的将TreeNote 添加到 TreeView 的目的。
1、 设计思路和方法
该程序设计思路和方法是:通过编程方式将TreeNote 添加到 TreeView 中。要将新的 TreeNote 添加到现有的 TreeNote 中,只需要使用 Nodes 属性的 Add() 方法。方法是使用 C# 代码将创建两个 TreeNote,并将第二个 TreeNote 添加为第一个 TreeNote 的子节点。然后,将第一个子节点添加到 TreeView 的根节点中。
2、开发实例及程序源码
2.1 使用前数据库和IE Web控件的准备工作
1)假如我们要建立如下图的数型结构

图 1
图1说明:器材管理、工地信息、公共信息是根节点,其余是子节点。
2)在oracle数据库中建立如下图表的数据库表及字段

图 2
图2 说明:在数据库中设计字段时将菜单等级确定下来,用流水号来表示唯一性。

图 3
图3说明:器材管理根节点的子节点,所属主单序号001表明它要生成在器材管理之下。

图 4
图4说明:工地信息根节点的子节点,所属主单序号002表明它要生成在工地信息之下。

图 5
图5说明:公共信息根节点的子节点,所属主单序号005表明它要生成在公共信息之下。
3)IE Web控件的准备工作
IE Web 控件可以在安装了 .NET Framework 版本 1.0 或 1.1 的 Web 服务器上使用,在内含代码的类中使用 IE Web 控件,首先需要右击 Reference(引用),然后选择 Add Reference(添加引用),将引用添加到 Microsoft.Web.UI.WebControls.dll 程序集中。然后,在内含代码的类中,如果使用的是 C# ,则添加 using Microsoft.Web.UI.WebControls;
2.2 界面和程序设计
1) 上传设计
1.1) Web界面如下

图 6
图6说明:在界面上对应设置控件TreeView1.
1.2) 动态生成TreeView源代码
using Microsoft.Web.UI.WebControls;//添加控件的引用 private void GetTreeView()//程序开始 { try { string strSql = "SELECT DISTINCT Menu_id,Menu_name from docmodulemanager where Menu_level = 1 and sn in ("+All.Substring(0,All.Length-1).ToString()+")"; OracleDataAdapter objAdapter = new OracleDataAdapter(strSql,objConn); DataSet ds = new DataSet(); ds.Clear (); objAdapter.Fill(ds,"temp"); DataTable dt = ds.Tables["temp"]; TreeView1.Nodes.Clear(); //建立根节点,遍历。 foreach(DataRow dr in dt.Rows) { TreeNode Root = new TreeNode(); Root.Text = dr["Menu_name"].ToString(); TreeView1.Nodes.Add(Root);//建立根节点 string str = "SELECT Menu_name,menu_addr,sn from docmodulemanager where upper_id = '" + dr["Menu_id"].ToString() + "' and sn in ("+menu_sn.Substring(0,menu_sn.Length-1).ToString()+")"+"order by menu_id,child_id"; OracleDataAdapter objAdapterNode = new OracleDataAdapter(str,objConn); DataSet dsNode = new DataSet(); dsNode.Clear (); objAdapterNode.Fill(dsNode,"tempNode"); DataTable dtNode = dsNode.Tables["tempNode"]; //建立子节点,遍历。 foreach(DataRow drNode in dtNode.Rows) { TreeNode Node = new TreeNode(); Node.Text = drNode["Menu_name"].ToString(); Node.Target = "mainbottom"; string Path = drNode["menu_addr"].ToString(); int menusn = Convert.ToInt32(drNode["sn"].ToString()); Node.NavigateUrl = "Transfer.aspx"+"?menu_addr="+ Path; Root.Nodes.Add(Node);//建立子节点 } } } catch { Response.Write(" alert('您没有可操作的菜单项,请与管理员联系!'); "); } finally { if (objConn.State.ToString().Equals ("Open")) objConn.Close(); } } |
递归调用:
动态添加treeview
private void bindtreeview()
{
this.TreeView1.Nodes.Clear();
string strsql = "select * from title,detitle where title.title_id=detitle.title_id";
DataSet ds = DB.ds(strsql);
this.ViewState["DataSet_Tree"] = ds;
addtree(0, (TreeNode)null);
}
public void addtree(int ParentId, TreeNode pnode)
{
DataSet DataSet_Tree = (DataSet)this.ViewState["DataSet_Tree"];
DataView DataView_Tree = new DataView(DataSet_Tree.Tables[0]);
DataView_Tree.RowFilter = "title_id=" + ParentId;
foreach (DataRowView row in DataView_Tree)
{
TreeNode Node = new TreeNode();
if (pnode == null)
{
Node.Text = row["title_name"].ToString();
Node.Value = row["title_id"].ToString();
this.TreeView1.Nodes.Add(Node);
Node.Expanded = true;//展开当前节点
addtree(Int32.Parse(row["title_id"].ToString()), Node);
}
else
{
Node.Text = row["detitle_name"].ToString();
Node.Value=row["detitle_id"].ToString();
pnode.ChildNodes.Add(Node);
Node.Expanded = true;
addtree(Int32.Parse(row["detitle_id"].ToString()), Node);
}
}
动态生成树读取xml数据(原创)
private void CreateMenu()
{
//实例一个XML文档对象
XmlDocument xDoc=new XmlDocument();
//调用通用方法从配置文件中获取定义菜单的XML文的路径
string path=HRAdminGlobals.ConfigFilePath + "menu.xml";
try
{
//从取得的路径加载XML文档
xDoc.Load(path);
//获取XML文档的根节点
XmlNode root=xDoc.DocumentElement;
if (root!=null)
{
//获取XML文档根节点下的一级菜单
XmlNodeList xnl=root.SelectNodes("main");
if (xnl!=null)
{
//根据权限显示不同的一级菜单
bool[] IsDisplay = new bool[3] {false,false,false} ;
//所有员工都具有员工自助的权限
IsDisplay[0] = true ;
//部门管理
if(pi.IsDept == "Y")
{
IsDisplay[1] = true ;
}
//系统管理
if(pi.IsSystem == "Y")
{
IsDisplay[2] = true ;
}
for(int i=0;i<xnl.Count;i++)
{
//不具备本节点的权限,跳至下一个节点
if(!IsDisplay[i])
{
continue ;
}
//获取当前XML文档节点及其属性
XmlNode xn=xnl[i];
XmlAttributeCollection acl=xn.Attributes;
//为树创建新的节点
TreeNode tn=new TreeNode();
this.tv_menu.Nodes.Add(tn);
//将新节点的属性设置为XML文档节点的属性
tn.ID=acl["text"].Value;
tn.Text=acl["text"].Value;
//注意NodeData中保存的是菜单关联的页面URL
tn.NodeData=acl["id"].Value;
//获取XML文档的下一级节点
XmlNodeList sl=xn.SelectNodes("sub");
if (sl!=null)
{
for(int j=0;j<sl.Count;j++)
{
XmlNode x=sl[j];
XmlAttributeCollection al=x.Attributes;
//为树创建下一级节点
TreeNode stn=new TreeNode();
tn.Nodes.Add(stn);
//将新节点的属性设置为XML文档节点的属性
stn.ID=al["text"].Value;
stn.Text=al["text"].Value;
//注意NodeData中保存的是菜单关联的页面URL
stn.NodeData=al["id"].Value;
}
}
}
}
}
/// 系统配置文件路径,只读
public static string ConfigFilePath
{
get
{
string configpath = "COMMON\\Configs\\" ;
string path = HttpRuntime.AppDomainAppPath ;
return path + configpath ;
}
}
}
catch{}
}
单击树菜单标题时转到url链接
function ClickTree()
{
var i = document.all.tv_menu.clickedNodeIndex; //获取点击的节点序号
//如果节点非空
if( i )
{
var d=new Date();
var s=d.toLocaleString();
s=s.replace(/ /ig,'_');
try
{
var url=tv_menu.getTreeNode(i).getAttribute("NodeData");
var oFrame=document.all.showFrame;
if (url)
{
var index = url.indexOf("?");
var flag="&";
if (index == -1)
{
flag="?";
}
//将URL赋给IFrame的src属性
if (oFrame != null)
{
oFrame.src=url+ flag +"d=" + s;
}
else
{
alert('Frame is null');
}
}
}
catch(e)
{}
}
}