树型控件TreeView的几种用法
1 基本用法
void TreeViewDataBind()
{
//首先清除树型控件内的结点
this.TreeView1.Nodes.Clear();
//实例出一个结点
TreeNode tn = new TreeNode();
tn.Text = "根结点";
tn.Value = "-1";
//把这个结点添加到树型控件中
this.TreeView1.Nodes.Add(tn);
//添加所有结点的递归方法
TreeViewBind(tn.ChildNodes, "0");
}
#region 树型控件递归绑定
/// <summary>
/// 添加所有结点的递归方法
/// </summary>
/// <param name="tnc">树型控件的结点</param>
/// <param name="Id">ParentId</param>
private void TreeViewBind(TreeNodeCollection tnc,string Id)
{
//先得到数据库中顶级所有结点
DataTable dt = Business.SysMenu.GetList("ParentId="+ Id);
//循环每一行数据
foreach (DataRow dr in dt.Rows)
{
//实例新结点
TreeNode tn = new TreeNode();
tn.Text = dr["title"].ToString();
tn.Value = dr["Id"].ToString();
//递归出该结点下的子结点
TreeViewBind(tn.ChildNodes, tn.Value);
//递归完成后添加到树型控件的结点中
tnc.Add(tn);
}
}
#endregion
从数据库中读出每个结点绑定到树型控件中
2 递归加遍例
实例:点击某结点,显示出该结点以及子结点下所有文章列表
#region 点击结点所激发的事件
protected void TV_Medical_SelectedNodeChanged(object sender, EventArgs e)
{
//定义承接某结点以及该结点下所有文章的ID号字符变量
TextId = "";
DataSet ds = new DataSet();
//如果点选的是根结点,则显示出所有文章
if (this.TV_Medical.SelectedNode.Depth == 0)
{
ds = Business.MedicalKnowledgeClass.GetList("");
this.GV_MCText.DataSource = ds;
this.GV_MCText.DataBind();
this.Pn_Display.Visible = false;
this.Pn_GridView.Visible = true;
return;
}
//如果选的不是根结点,则递归遍例出该结点以及子结点下所有文章列表
TextId = GetNodesText(this.TV_Medical.SelectedNode, TextId, Convert.ToInt32(this.TV_Medical.SelectedNode.Value.ToString()));
//如果有文章
if (TextId != "")
{
ds = Business.MedicalKnowledgeClass.GetList(" MC_Id in (" + TextId + ")");
}
else
{
//ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "CheckSearch", "alert('该结点下没有任何文章');", true);
//initPage();
//DataTable dt = new DataTable();
//dt.Rows.Add(
//return;
}
//列表绑定
this.GV_MCText.DataSource = ds;
this.GV_MCText.DataBind();
this.Pn_Display.Visible = false;
this.Pn_GridView.Visible = true;
}
#endregion
#region 得到某一结点下的所有文章的ID号
/// <summary>
/// 利用递归遍历选中结点的所有文章和子结点文章
/// </summary>
/// <param name="tnc">选中的结点</param>
/// <param name="a">用来存储文章ID的变量</param>
/// <param name="ParentId">要得到文章父结点的编号</param>
/// <returns>返回存储文章编号的字符串</returns>
private string GetNodesText(TreeNode tnc,string a,int ParentId)
{
//先把当前选中结点下的文章ID存储到全局字符串变量中
TextId =TextId+ Business.MedicalKnowledgeClass.GetParentText(ParentId);
//遍历该结点的子结点
for (int i = 0; i < tnc.ChildNodes.Count; i++)
{
//得到每个字节点递归得出子结点下的文章的ID号
GetNodesText(tnc.ChildNodes[i], TextId,Convert.ToInt32(tnc.ChildNodes[i].Value) );
}
return TextId ;
}
#endregion
树型控件的外观设置:
ShowLines显示边线
SelectedNodeStyle CssClass="leftNav_active" 选中后变色(加载CSS)
在递归加载树型控件的时候,还有两个属性也要知道
tn.SelectAction = TreeNodeSelectAction.Select;表示该节点在选中后的动作
TreeNodeSelectAction.Select表示选中后引发树型控件的SelectedChanged事件
TreeNodeSelectAction.Expand表示选中后引发树型控件的展开事件
TreeNodeSelectAction.None什么也不做
TreeNodeSelectAction.SelectExpand表示选中后引发树型控件的SelectedChanged事件+展开事件
另一属性 tn.NavigateUrl = "MedicalKnowledgDisplay_Right.aspx?TextId=" + dr["Mc_ID"].ToString()
该节点的url
Target="right"是选中该节点后在哪个iframe里显示
完整的递归实例:
#region 树型控件递归方法绑定
/// <summary>
/// 树型控件递归出所有结点
/// </summary>
/// <param name="tnc">一个结点的实例(根结点)</param>
/// <param name="ParentId">所属父系结点的ID号</param>
void MyTreeViewBind(TreeNodeCollection tnc, int ParentId)
{
//先得到所有父系结点的结果集
DataSet ds = Business.MedicalKnowledgeClass.GetList("MC_ParentId=" + ParentId + " and MC_Type=0");
//循环每一行
foreach (DataRow dr in ds.Tables[0].Rows)
{
//实例出一个结点
TreeNode tn = new TreeNode();
//给结点的属性付值
tn.Text = dr["MC_Title"].ToString();
tn.Value = dr["MC_Id"].ToString();
//再递归出该结点的子结点
MyTreeViewBind(tn.ChildNodes, Convert.ToInt32(dr["MC_Id"].ToString()));
tn.SelectAction = TreeNodeSelectAction.SelectExpand;
tn.NavigateUrl = "MedicalKnowledgDisplay_Right.aspx?TextId=" + dr["Mc_ID"].ToString();
//递归出所有结点后,添加给根结点
tnc.Add(tn);
}
}
#endregion