您的位置:首页 > 编程语言 > ASP

ASP.NET的TreeView控件使用

2018-02-28 19:29 387 查看

一、定义

1TreeView

TreeView 为一种用树形来组织数据的方式。例如我们经常看到的网页的菜单,有一级菜单,二级菜单,甚至还会有三级菜单。可以简单的把这些菜单看成一个树,每一个链接都是树的一个节点。。包含其他节点的节点称为“父节点”。包含在其他节点中的节点称为“子节点”。没有任何子节点的节点称为“叶节点”。不被任何其他节点包含并且是所有其他节点的上级节点的节点称为“根节点”。一个节点可以同时是父节点和子节点,但是不能同时为根节点、父节点和叶节点。节点为根节点、父节点还是叶节点决定着节点的几种可视化属性和行为属性。
《转自MSDN》
2. TreeNodeTreeNode 对象由以下四个用户界面 (UI) 元素组成,可以自定义或隐藏这些元素:
展开节点指示图标,以表明节点是展开的、折叠的还是不可展开的。

与节点关联的可选复选框。

可选的节点图像。

节点文本。

        可以通过设置 TreeView 类的 ExpandImageUrlCollapseImageUrl 和 NoExpandImageUrl 属性,指定可展开、可折叠和不可展开的节点的自定义图像。通过将 TreeView 类的 ShowExpandCollapse 属性设置为 false,甚至可以完全隐藏展开节点的指示图标。        若要在节点旁显示复选框,请设置 TreeView 类的 ShowCheckBoxes 属性。如果 ShowCheckBoxes 属性设置为 TreeNodeType.Node 以外的一个值,将在指定的节点类型旁显示复选框。通过设置节点的 ShowCheckBox 属性,可以有选择地重写个别节点的复选框。如果显示复选框,可使用 Checked 属性确定复选框是否被选中。         通过设置 ImageUrl 属性可以在节点中显示图像。此图像显示在节点文本旁。          TreeView 控件中的节点文本可以处于两种模式之一:选择模式或导航模式。默认情况下,会有一个节点处于选定状态。若要使一个节点处于导航模式,请将该节点的 NavigateUrl 属性值设置为空字符串 ("") 以外的值。若要使节点处于选择模式,请将节点的 NavigateUrl 属性设置为空字符串。        默认情况下,单击处于选择模式的节点会将页面回发到服务器并引发 SelectedNodeChanged 事件。也可以选择设置节点的 SelectAction 属性,指定引发其他事件。有关更多信息,请参见 SelectAction。若要确定哪个节点在被单击时处于选择模式,请使用 TreeView 控件的 SelectedNode 属性。       当节点处于导航模式时,禁用该节点的所有选择事件。单击处于导航模式的节点时,用户将被定向到指定的 URL。可以选择设置 Target 属性以指定用来显示链接内容的窗口或框架。        TreeNode 类包含一些用于存储节点状态的属性。可使用 Selected 属性确定节点是否被选定。若要确定节点是否已展开,请使用 Expanded 属性。DataBound 属性用于确定节点是否绑定到数据。当节点绑定到数据时,可以使用 DataItem 属性访问基础数据项。        此类提供了一些属性,有助于确定一个节点相对于树中其他节点的位置。使用 Depth 属性确定节点的深度。使用 ValuePath 属性可以获得从当前节点到其根节点的分隔节点列表。若要确定节点的父节点,请使用 Parent 属性。使用 ChildNodes 集合访问子节点。       有时,静态地预定义树结构并不可行,因为有时数据大小或自定义内容依用户输入而定。因此,TreeView 控件支持动态节点填充。在运行阶段,可以在展开节点时填充该节点。有关动态节点填充的更多信息,请参见PopulateOnDemand 属性。       有关 TreeNode 的实例的初始属性值列表,请参见 TreeNode 构造函数。3. TreeNodeCollection        TreeNodeCollection 类用于存储和管理 TreeView 控件中的 TreeNode 对象的集合。TreeView 控件在其两个属性中使用 TreeNodeCollection 类。在 Nodes 属性中存储其根节点,在 CheckedNodes 属性中存储其选定的节点。TreeNodeCollection 集合也用于 ChildNodes 属性来存储子节点(如果有的话)。         TreeNodeCollection 类支持多种访问集合中的项的方法:使用 Item 索引器直接在特定的从零开始的索引处检索 TreeNode 对象。

使用 GetEnumerator 方法创建可用于循环访问集合的枚举数。

使用 foreach (C#) 或 For Each (Visual Basic) 循环访问集合。

使用 CopyTo 方法将集合的内容复制到一个 Array 对象中。

         可以通过添加和移除 TreeNode 对象以编程方式管理 TreeNodeCollection。若要在集合中添加节点,请使用 Add 或 AddAt 方法。若要从集合中移除节点,请使用 RemoveRemoveAt 或 Clear 方法。
例如树形图---->



二、用法

例子:包含三个部分:一、网页前端(WebForm1.aspx))二、web.config的配置(数据库的连接)三、数据库处理层(DBhelper.cs)四、xml文件(AreaName.xml

效果:
 

 
实现:

   一、网页前端(包含一个TreeView,一个XmlDataSource,两个LinkbButton(绑定删除与添加事件),三个label,两个select控件,一个TextBox)

    实现:

1、WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication4.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" Width="193px">
<DataBindings>
<asp:TreeNodeBinding DataMember="Area" ShowCheckBox="True" TextField="name" ValueField="value" />
<asp:TreeNodeBinding DataMember="Province" ShowCheckBox="True" TextField="name" ValueField="value" />
<asp:TreeNodeBinding DataMember="City" ShowCheckBox="True" TextField="name" ValueField="value" />
</DataBindings>
</asp:TreeView>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/AreaName.xml"></asp:XmlDataSource>
<asp:Label ID="Label2" runat="server" Text="区域名"></asp:Label>;
<asp:TextBox ID="txt_name" runat="server"></asp:TextBox>
<asp:Label ID="Label1" runat="server" Text="上级"></asp:Label>;
<select id="se" runat="server">
<option value="0">
请选择
</option>

</select>
<asp:Label ID="Label3" runat="server" Text="级别"></asp:Label>
<select id="se1" runat="server">
<option value="0">
请选择
</option>
<option value="1">
省级
</option>
<option value="2">
市级
</option>
</select>
<br />
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="onclick_insert">添加</asp:LinkButton>
<br />
<asp:LinkButton ID="LinkButton2" runat="server" OnClick="onclick_delete">删除</asp:LinkButton>
</form>
</body>
</html>

二、WebForm1.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.Security;
using WebApplication4.DAL;
using System.Xml;
namespace WebApplication4
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{//页面加载刷新时都应该重新绑定与重写XMl文件
databindselect();
AddXML();
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
}
public void databindselect()//将数据库的数据绑定到select(ID=se)中
{
string sql = "select * from Area";
DataSet ds = DBhelper.QuerySql(sql);
foreach (DataRow dr in ds.Tables[0].Rows)
{
this.se.Items.Add(new ListItem(dr["name"].ToString(),dr["ID"].ToString()));//value=dr["name"],ID=dr["ID"]
}

}
public void onclick_insert(object sender, EventArgs e)//插入事件的实现
{
string name = this.txt_name.Text.ToString().Trim();//获取TextBox的值
int id = Convert.ToInt32(this.se.Value);//获取select(ID=se) 控件被选中的值
int level = Convert.ToInt32(this.se1.Value); //获取select(ID=se1)控件被选中的值
string selectsql="select * from Area where Name='"+name+"'";
DataSet ds = DBhelper.QuerySql(selectsql);//判断所要插入的数据是否存在于数据库里面
int row = ds.Tables[0].Rows.Count;
if (row == 0)//如果不存在,就插入到数据库中
{
string sql = "insert into Area(Name,parentID,level) values('" + name + "'," + id + "," + level + ")";
DBhelper.QuerySql(sql);//将数据插入数据库中
AddXML();//重写XML文件以便重新绑定

}
databindselect();//重新绑定到select
this.XmlDataSource1.DataFile = "~/App_Data/AreaName.xml";//XMLDataSource1控件的文件配置
TreeView1.DataBind();//TreeView的绑定
}
public void onclick_delete(object sender, EventArgs e)
{   //上级的勾选的子集的去除(就是那个select 的下拉列表)--->删除数据库中的子集结果--->删除选中的节点的数据库数据-->删除select控件的节点

TreeNodeCollection tr = TreeView1.CheckedNodes;// TreeNodeCollection 类用于存储和管理 TreeView 控件中的 TreeNode 对象的集合。此语句是找出被选中的节点
if (tr.Count > 0)//如果有被选中的节点
{
for (int i = 0; i < tr.Count; i++)//遍历节点,总数为被选中的节点的数量
{
string selectchildsql = "select * from Area where parentID=" + Convert.ToInt32(tr[i].Value);//sql语句--找出此节点的子集
DataSet dsc = DBhelper.QuerySql(selectchildsql);//以数据集的形式显示子集
//通过for循环删除select 中显示的选中的元素的子集
foreach (DataRow dr in dsc.Tables[0].Rows)
{
this.se.Items.Remove(new ListItem(dr["Name"].ToString(), dr["ID"].ToString()));

}

string childnodesql = "delete from Area where parentID=" + Convert.ToInt32(tr[i].Value);
DBhelper.QuerySql(childnodesql);//删除被选中的节点的数据库中的子集
string selectsql = "select  * from Area where ID=" + Convert.ToInt32(tr[i].Value);
DataSet ds = DBhelper.QuerySql(selectsql);//删除数据库中被选中的节点
foreach (DataRow dr in ds.Tables[0].Rows)
{
this.se.Items.Remove(new ListItem(dr["Name"].ToString(), dr["ID"].ToString()));//删除被选中的节点在select控件的值
}
string sql = "delete from Area where ID=" + Convert.ToInt32(tr[i].Value);
DBhelper.Handlesql(sql);
AddXML();//重写XML文件
}

}
XmlDataSource1.DataFile = "~/App_Data/AreaName.xml";//数据源配置文件
TreeView1.DataBind();//重新绑定到控件
}
XmlTextWriter tw = null;
public void AddXML()
{
DataSet ds = DBhelper.QuerySql("select  * from Area");
string filename = AppDomain.CurrentDomain.BaseDirectory + "App_Data\\AreaName.xml";//找到位置
tw = new XmlTextWriter(filename,null);//书写xml的文件
tw.Formatting = Formatting.Indented;//额,这个不懂
tw.WriteStartDocument();//开始书写XMl文件
WriteXMl(ds.Tables[0]);//写入数据集
tw.WriteEndDocument();//结束书写
tw.Flush();
tw.Close();
}
/// <summary>
/// 绑定一条数据的代码到xml文件中
/// </summary>
/// <param name="dr"></param>
public void WriteOneXML(DataRow dr)//在xml文件中写入一条数据例如<Province></Province>或者<City></City>,通常配合遍历使用
{
switch(Convert.ToInt32(dr["level"]))//根据等级判断所要添加的头
{
case 0 :
tw.WriteStartElement("Area");
break;
case 1:
tw.WriteStartElement("Province");
break;

case 2:
tw.WriteStartElement("City");
break;

}
tw.WriteAttributeString("value",dr["ID"].ToString());
//<Area value="##" name="###">
//</Area>
tw.WriteAttributeString("name",dr["Name"].ToString());

}
static int  count=0;//初始化所要循环的条数

public void WriteXMl(DataTable  dt)
{//在遍历子节点的时候,遍历完了就会自动停止。
DataSet ds=DBhelper.QuerySql("select * from Area");
foreach (DataRow dr in dt.Rows)//循环的子集的元素
{
if (count != ds.Tables[0].Rows.Count)//这个count是为了遍历所有节点,这个树遍历完了之后才会清零,所以一开始要与ds.Table[0].Rows.Count(总数)比较
{
count++;//写的次数等于所要写的条数
WriteOneXML(dr);
DataTable ddt = Getdata(dr);//遍历节点,搜寻他的所有子节点,并写入xml文件
WriteXMl(ddt);//递归寻找字节点
tw.WriteEndElement();

}
else
{
count = 0;//如果整个树遍历完了之后就退出
break;

}
}
}
public DataTable Getdata(DataRow dr)//获取它的子节点,并以一个数据集的形式返回
{
string sql="select * from Area where parentID="+Convert.ToInt32(dr["ID"]);
DataSet ds=DBhelper.QuerySql(sql);
return ds.Tables[0];
}

protected void TreeView1_SelectedNodeChanged1(object sender, EventArgs e)
{

}
protected void TreeNodeCheckChanged1(object sender, EventArgs e)
{

}
}

}

<
a8e4
/p>



二、Web.config的配置

<?xml version="1.0" encoding="utf-8"?>

<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 -->

<configuration>
<appSettings>
<add key="areastring" value="Data Source=LAPTOP-GVN8NUV2\SQLEXPRESS;Initial Catalog=StudentInfo;Integrated Security=True"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>

</configuration>
三、数据库处理层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
namespace WebApplication4.DAL
{
public static class DBhelper
{
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns></returns>
public static DataSet QuerySql(string sql)
{

using (SqlConnection coon = new SqlConnection())
{
coon.ConnectionString = ConfigurationManager.AppSettings["areastring"];
SqlDataAdapter da = new SqlDataAdapter(sql, coon);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
/// <summary>
/// 数据的增删改查工作
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int Handlesql(string sql)
{
using (SqlConnection coon = new SqlConnection())
{
coon.ConnectionString = ConfigurationManager.AppSettings["areastring"];
coon.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = coon;
cmd.CommandText = sql;
int x = cmd.ExecuteNonQuery();
coon.Close();
return x;
}

}

}
}
四 Xml的配置(可以随便写,反正需要重新书写XML文件)
<?xml version="1.0"?>
<Area value="1" name="省份">
<Province value="2" name="北京市" />
<Province value="3" name="上海市" />
<Province value="31" name="天津市" />
<Province value="32" name="重庆市" />
<Province value="33" name="湖北省">
<City value="34" name="武汉市" />
</Province>
<Province value="65" name="河南省">
<City value="66" name="郑州市" />
</Province>
<Province value="67" name="江西省">
<City value="69" name="南昌市" />
</Province>
<Province value="71" name="安徽" />
<Province value="72" name="河北" />
</Area>
 



   

     

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: