树型控件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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!