通常TreeView控件的节点数据是使用xml文件保存于Web目录下的,可以使用XmlDataSource进行数据绑定,那么如果将节点数据保存与数据库中,怎样读取数据才最简单高效呢?
下面的图片是数据库中的一张数据表,保存了一个网站上TreeView控件的节点信息
【NodeId 】为标识列 自动增长
【DisplayName】为节点文本
【ParentNodeId】为对应的父节点的Id
【NavigateUrl】为节点对应的Url地址
页面后置代码如下:
public partial class TreeViewTest : System.Web.UI.Page
{
DataTable table;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//如果页面是首次加载
{
SqlConnection conn = new SqlConnection("【数据库连接字符串】");
SqlDataAdapter sda=new SqlDataAdapter("select * from 【表名】",conn);
table = new DataTable();
sda.Fill(table);
ShowTreeView("0",null);
}
}
private void ShowTreeView(string nodeId,TreeNode nodeTemp)
{
DataView dv=new DataView(table);
dv.RowFilter = "parentNodeId =" + nodeId;
foreach(DataRowView drv in dv)
{
TreeNode node=new TreeNode();
node.Text=drv["DisplayName"].ToString();
node.Value=drv["NodeId"].ToString();
node.NavigateUrl=drv["NavigateUrl"].ToString();
if (nodeId == "0")
{
TreeView1.Nodes.Add(node);
}
else
{
nodeTemp.ChildNodes.Add(node);
}
ShowTreeView(node.Value, node);//自己调用自己,递归算法
}
}
protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
TreeNode node = e.Node;
CheckChildNode(node);
CheckParentNode(node);
}
private void CheckChildNode(TreeNode node)
{
foreach (TreeNode tempNode in node.ChildNodes)
{
tempNode.Checked = node.Checked;
if (tempNode.ChildNodes.Count > 0)
{
CheckChildNode(tempNode);
}
}
}
private void CheckParentNode(TreeNode node)
{
if (node.Parent != null)
{
TreeNode nodeTemp = node.Parent;
nodeTemp.Checked = node.Checked;
if (nodeTemp.Parent != null)
{
CheckParentNode(nodeTemp);
}
}
}
}
在页面文件中加入如下script脚本:(要在TreeView控件之上,最好写在<head>中)
<script type="text/javascript">
function checkNode(){
var obj=window.event.srcElement;
if(obj.tagName=="INPUT" && obj.type=="checkbox")
{
form1.submit();
}
}
</script>
方法:private void ShowTreeView()就是加载TreeView控件的方法
这里的TreeView控件加入了复选框,所以又添加了两个方法:
1 private void CheckParentNode() 【选中或取消当前节点的所有父节点】
2 private void CheckChildNode() 【选中或取消当前节点的所有子节点】
实际开发中在界面层是不会连接数据库的,所以可以将该表作为一个实体,在数据访问层中返回该实体类型的集合,然后在界面进行加载