本人用的是微软TreeView树形控件.现在在项目中遇到两个树状问题.问题1:我想做一个企业的结构,例:动态新增一个部门.这个部门有可能是三级或四级....N级目录下.问题2:想做一个部门和用户相关联的树形结构.例:生产部有张三,李四.财务部有王六,陈九...等.是能给出详细例子就最好不过了.(代码绑定,和数据结构的设计)感激不尽.
解决方案 »
- asp.net创建控件时出错
- Drawing.Image转换图片格式后,上传图片出错?
- asp.net页面启用了页面缓存还有必要在iis里启用KernelCaching吗?
- sql高手过来看下
- repeater绑定问题
- Visual Studio 2005在设计ASP.NET页面时看不到CSS效果怎么解决
- 水晶报表在vs2005中怎样才可以放在.aspx文件中在浏览器中浏览
- Asp.Net插入数据失败~~ 错在哪里?
- c#如果获取multipart/form-data的数据?
- 我用VS2005,创建一个asp.net网站后,出来一个网页上面可以把控件拖上去,但不能像VB一样随意拖到什么位置?
- 再次讨论一下web服务器控件和Html控件吧,我现在越来越迷茫,up有分
- 能用代码实现对本地目录文件进行操作吗?
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv;
TreeNode tmpNd;
string intId;
dv=DataOper.SqlDataView ("select * from s_menu");
dv.RowFilter="ParentId='" + parentId+ "'" ;
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
tmpNd.ID=drv["NodeId"].ToString();
tmpNd.Expanded=true;
tmpNd.Text=drv["NodeName"].ToString();
tmpNd.ImageUrl="webctrl_client/1_0/treeimages/"+drv["Icon"].ToString();
tmpNd.NavigateUrl=drv["Address"].ToString();
tmpNd.Target =drv["target"].ToString ();
Nds.Add(tmpNd);
intId=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.ID);
}
dv.Dispose ();
DataOper.CnClose ();
}
这种技术叫着无限级菜单
Nodeid char(6)
parentID char(6)
NodeName char(20)
Icon char(20)
Address char(20)
target char(8)
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data .SqlClient ;
using Microsoft.Web .UI.WebControls ;namespace ReportTest
{
/// <summary>
/// WebForm3 的摘要说明。
/// </summary>
public class WebForm3 : System.Web.UI.Page
{
protected System.Data.SqlClient.SqlConnection sqlConnection1;
protected Microsoft.Web.UI.WebControls.TreeView TreeView1;private void Page_Load(object sender, System.EventArgs e)
{
if (!this.IsPostBack )
{
this.sqlConnection1 .Open ();
// this.TreeView1 .ExpandLevel=2;this.ShowAllTree (0,this.sqlConnection1,this.TreeView1.Nodes) ;}
}private TreeNodeCollection ShowAllTree(int ddd ,SqlConnection SqlConnection1,Microsoft.Web.UI.WebControls.TreeNodeCollection nodes)
{stringsqlSelect =
"SELECT parent_id , this_id,this_name FROM tree where parent_id='"+ddd+"'" ;SqlDataAdapter da = new SqlDataAdapter(sqlSelect, this.sqlConnection1);
DataTable dt=new DataTable();
da.Fill(dt);for(int i=0;i<dt.Rows.Count;i++)
{
TreeNode newNode=new TreeNode();
DataRow dr=dt.Rows[i];
newNode.Text= dr["this_name"].ToString();
nodes.Add(newNode);int newID = Convert.ToInt32 (dt.Rows[i][1]);;ShowAllTree(newID,this.sqlConnection1 ,newNode.Nodes); //递归调用,将子结点ID当做下一当前结点ID}dt.Dispose();
return nodes;
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();
//
// sqlConnection1
//
this.sqlConnection1.ConnectionString = "workstation id=GW;packet size=4096;user id=sa;data source=GW;persist security inf" +
"o=True;initial catalog=pubs;password=";
this.Load += new System.EventHandler(this.Page_Load);}
#endregion
}
}
表结构create table tree(
parent_id int not null,
this_id int not null,
this_name varchar(20) not null
)
insert into tree values(0,1,'第一个结点');
insert into tree values(0,2,'第二个结点');
insert into tree values(0,3,'第三个结点');
insert into tree values(1,11,'结点1.1');
insert into tree values(1,12,'结点1.2');
insert into tree values(12,121,'结点121');
insert into tree values(121,1211,'结点1211');
private void fillTv(string strName)
{
string[] strTemp;
int Length;
string strQuery="select * from "+strName+" where RiverLevel = 0";
gzsl.dataControl dc=new dataControl();
string mRead=dc.getRead(strQuery,0);
if(!(mRead==""))
{
strTemp=mRead.Split(new char[] {','});
Length=strTemp.Length;
for(int i=0;i<Length;i++)
{
Microsoft.Web.UI.WebControls.TreeNode tn=new Microsoft.Web.UI.WebControls.TreeNode();
tn.Text=strTemp[i];
tn.Expanded=true;
// this.trShow.Nodes.Add(tn);
this.trShow.Nodes.AddAt(0,tn);
getChildren(tn,strName);
}
}
} private void getChildren(Microsoft.Web.UI.WebControls.TreeNode trn,string strName)
{
string strFather=trn.Text.Trim();
string strQuery="select * from "+strName+" where FatherRiver = '"+strFather+"'";
string strRead="";
string[] strTemp;
gzsl.dataControl dc=new dataControl();
strRead=dc.getRead(strQuery,0);
if(!(strRead==""))
{
strTemp=strRead.Split(new char[] {','});
for(int i=0;i<strTemp.Length;i++)
{
Microsoft.Web.UI.WebControls.TreeNode mTn=new Microsoft.Web.UI.WebControls.TreeNode();
mTn.Text=strTemp[i];
mTn.Expanded=true;
trn.Nodes.AddAt(0,mTn);
getChildren(mTn,strName);
}
} }
数据库 sqlserver,表结构如下:
名称 类型
Name varchar
RiverLevel int
FatherRiver varchar
{
//添加特定Item时这样绑定(这里添加多一个“无(做为一级栏目)”的选择,不在数据库读取的)
//且根据接收的Depth判断他的深度
//ddlParentID.Items.Add(new ListItem("无(做为一级栏目)","0"));
while ( sdr.Read() )
{
int tmpDepth=(int)sdr["Depth"];
int[] arrShowLine;
for(int i=0;i<20;i++)
{
arrShowLine=new int[i];
//arrShowLine[i]=1;
//ShowLine=true;
}
int tmpNextID=(int)sdr["NextID"];
if (tmpNextID>0)
{
arrShowLine=new int[tmpDepth];
//ShowLine=true;
}
else
{
//arrShowLine[tmpDepth]=-2;
//ShowLine=false;
}
//子栏目输出方式
if (tmpDepth>0)
{
string strTemp="";
for(int i=1;i<tmpDepth+1;i++)
{
strTemp=strTemp+" ";
if(i==tmpDepth)
{
if((int)sdr["NextID"]>0)
{
strTemp=strTemp+"├ ";
}
else
{
strTemp=strTemp+"└ ";
}
}
else
{
if (arrShowLine==new int[tmpDepth])
{
strTemp=strTemp+"│";
}
else
{
strTemp=strTemp+" ";
}
}
}
strTemp=strTemp+sdr["ClassName"].ToString(); //判断是否外部连接
if (sdr["LinkUrl"].ToString()!="")
{
strTemp=strTemp+"(外)";
}
//
ddlParentID.Items.Add(new ListItem(HttpUtility.HtmlDecode(strTemp),sdr["ClassID"].ToString() ));
}
//跟栏目输出方式
else
{
//判断是否外部连接
if (sdr["LinkUrl"].ToString()!="")
{
ddlParentID.Items.Add(new ListItem(sdr["ClassName"].ToString()+"(外)",sdr["ClassID"].ToString() ));
}
else
{
ddlParentID.Items.Add(new ListItem(sdr["ClassName"].ToString(),sdr["ClassID"].ToString() ));
}
}
}
con.Close();
}