阿潇

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
无意发现在网上很刚学C#的朋友们都在找关于C#如何递归实现TreeView的绑定,见网上很多例子都比较深奥,我特意写了个比较简单易懂的例子帮助大家了解C#TreeView的操作与递归的实现...

本文只是用递归的方式简单实现TreeView的操作,可能存在性能上的问题,仅供初学者参考。

效果图:

一:创建数据库和数据表(Area)

二:创建AreaManage项目:

以下是各个类文件的代码:

1.1.SQLOperate.cs

 

代码
/// <summary>
///SQLOperate 的摘要说明
/// </summary>
public class SQLOperate
{

/// <summary>
/// 根据parentId查地区信息
/// </summary>
/// <param name="parentId"></param>
/// <returns></returns>
public static DataTable GetAreaInfoByParentId(int parentId)
{
string sql = "select * from Area where ParentId = @ParentId";
SqlParameter[] para
= new SqlParameter[]
{
new SqlParameter("@ParentId",parentId)
};
return DBHelper.GetDataSet(sql, para);
}
/// <summary>
/// 根据ID查找地区
/// </summary>
/// <param name="areaId"></param>
/// <returns></returns>
public static DataTable GetAreaInfoById(int areaId)
{
string sql = "select * from Area where AreaId = @AreaId";
SqlParameter[] para
= new SqlParameter[] { new SqlParameter("@Areaid",areaId)};
return DBHelper.GetDataSet(sql, para);

}
/// <summary>
/// 增加同一级地区
/// </summary>
/// <param name="parentId"></param>
/// <param name="areaName"></param>
/// <returns></returns>
public static int AddParityClass( int parentId,string areaName)
{
string sql = "insert into Area(AreaName,ParentId)values(@AreaName,@ParentId)";
SqlParameter[] para
= new SqlParameter[]
{
new SqlParameter("@AreaName",areaName),
new SqlParameter("@ParentId",parentId)
};
return DBHelper.ExecuteCommand(sql, para);
}
/// <summary>
/// 增加下一级地区
/// </summary>
/// <param name="parentId"></param>
/// <param name="areaName"></param>
/// <returns></returns>
public static int AddNextClass(int parentId, string areaName)
{
string sql = "insert into Area(AreaName,ParentId)values(@AreaName,@ParentId)";
SqlParameter[] para
= new SqlParameter[]
{
new SqlParameter("@AreaName",areaName),
new SqlParameter("@ParentId",parentId)
};
return DBHelper.ExecuteCommand(sql, para);
}
/// <summary>
/// 查询是否有子集
/// </summary>
/// <param name="parentId"></param>
/// <returns></returns>
public static bool CheckNextClass(int parentId)
{
string sql = "select AreaId from Area where ParentId = @ParentId";
SqlParameter[] para
= new SqlParameter[] { new SqlParameter("@ParentId",parentId)};
using(SqlDataReader reader = DBHelper.ExecuteReader(sql,para))
{
if (reader.Read())
return true;
else
return false;
}
}
/// <summary>
/// 删除地区
/// </summary>
/// <param name="areaId"></param>
/// <returns></returns>
public static int DeleteClass(int areaId)
{
string sql = "Delete from Area where AreaId = @AreaId";
SqlParameter[] para
= new SqlParameter[] { new SqlParameter("AreaId",areaId)};
return DBHelper.ExecuteCommand(sql, para);
}
/// <summary>
/// 修改地区名
/// </summary>
/// <param name="areaId"></param>
/// <param name="areaName"></param>
/// <returns></returns>
public static int ModifyClass(int areaId ,string areaName)
{
string sql = "Update Area set AreaName = @AreaName where AreaId = @AreaId";
SqlParameter[] para
= new SqlParameter[] { new SqlParameter("@AreaName", areaName), new SqlParameter("@AreaId",areaId) };
return DBHelper.ExecuteCommand(sql, para);
}
}

 

 

2.模板页(MasterPage.master)

 

代码
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>地区管理</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div style="float:left; width:300px" >

<asp:TreeView ID="tvArea" runat="server">
</asp:TreeView>
</div>
<div style="float:left">
<asp:ContentPlaceHolder ID="cphArea" runat="server">
</asp:ContentPlaceHolder>
</div>

</div>
</form>
</body>
</html>

 

 

模板页后台代码:(MasterPage.master.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;

public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindTreeView();
}
}
/// <summary>
/// 初始化treeview
/// </summary>
private void BindTreeView()
{
TreeNode treeNode
= new TreeNode("地区管理");
treeNode.Value
= "-1";
treeNode.NavigateUrl
= "Default.aspx";
PopulateTreeView(
0, treeNode);
tvArea.Nodes.Add(treeNode);


}
/// <summary>
/// 递归绑定treeview 效率有待改进
/// </summary>
/// <param name="parentId"></param>
/// <param name="parentNodes"></param>
private void PopulateTreeView(int parentId,TreeNode parentNodes)
{
DataView dv
= SQLOperate.GetAreaInfoByParentId(parentId).DefaultView;
try
{
foreach (DataRowView drv in dv)
{
TreeNode myTreeNode
= new TreeNode(drv["AreaName"].ToString());

myTreeNode.Value
= drv["AreaId"].ToString();
myTreeNode.NavigateUrl
= "Default.aspx?id=" + drv["AreaId"].ToString();
parentNodes.ChildNodes.Add(myTreeNode);
PopulateTreeView(Convert.ToInt32(drv[
"AreaId"]), myTreeNode);
}
}
catch (StackOverflowException ex) //如果递归进入死循环会发生此异常
{
Console.WriteLine(ex.Message.ToString());
}

}
}

 

Default.aspx 页面代码(只为显示效果,不曾考虑排版)

 

代码
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="cphArea" Runat="Server">
<script language="javascript" type="text/javascript">
function checkAreaName() {
var areaName
= document.getElementById("ctl00_cphArea_txtAreaName");
if (areaName.value == "") {
alert(
"请输入地区名...");
return false;
}
}
</script>

<table border="1">
<tr>
<td>
ID:
</td>
<td>
<asp:Label ID="lblAreaId" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
AreaName:
</td>
<td>
<asp:Label ID="lblAreaName" runat="server"></asp:Label></td>
</tr>
<tr>
<td>
ParentId:
</td>
<td>
<asp:Label ID="lblParentId" runat="server"></asp:Label></td>
</tr>
<tr>
<td colspan="2">
请输入地区名...
</td>
</tr>
<tr>
<td>
地区名:
</td>
<td>
<asp:TextBox ID="txtAreaName" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="2" style="height: 22px">
<asp:Button ID="btnDel" runat="server" Text=" 删除 " onclick="btnDel_Click" />
<asp:Button ID="btnModify" runat="server" Text=" 修改 "
OnClientClick
="return checkAreaName()" onclick="btnModify_Click" />
<asp:Button ID="btnAddParityClass" runat="server" Text=" 添加同级 " OnClientClick="return checkAreaName()" onclick="btnAddParityClass_Click"
/>
<asp:Button ID="btnAddNextClass" runat="server" Text=" 添加下一级 " OnClientClick="return checkAreaName()" onclick="btnAddNextClass_Click"
/>
</td>
</tr>
</table>


</asp:Content>

 

Default.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;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind();
}
}
/// <summary>
/// 初始化数据
/// </summary>
private void Bind()
{
int id = Convert.ToInt32(Request.QueryString["id"]);
if (id == 0)
{
;
}
else
{
DataTable dataTable
= SQLOperate.GetAreaInfoById(id);
lblAreaId.Text
= dataTable.Rows[0]["AreaId"].ToString();
lblAreaName.Text
= dataTable.Rows[0]["AreaName"].ToString();
lblParentId.Text
= dataTable.Rows[0]["ParentId"].ToString();
}
}
/// <summary>
/// 删除地区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnDel_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(Request.QueryString["id"]);
if (id == 0)
{
Response.Write(
"<script>alert('请选择相应的节点!');</script>");
}
else
{
if (SQLOperate.CheckNextClass(id))
Response.Write(
"<script> alert('请先删除子项...') </script>");
else
{
int result = SQLOperate.DeleteClass(id);
if (result > 0)
{
Response.Write(
"<script> alert('删除成功...');location.href='Default.aspx'; </script>");
}
}
}
}
/// <summary>
/// 修改地区名
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnModify_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(Request.QueryString["id"]);
if (id == 0)
{
Response.Write(
"<script>alert('请选择相应的节点!');</script>");
}
else
{
DataTable dataTable
= SQLOperate.GetAreaInfoById(id);
int result = SQLOperate.ModifyClass(Convert.ToInt32(dataTable.Rows[0]["AreaId"].ToString()),
txtAreaName.Text.ToString().Trim());
if (result > 0)
Response.Write(
"<script>alert('修改成功!'); location.href='Default.aspx'; </script>");
}
}
/// <summary>
/// 添加同级地区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAddParityClass_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(Request.QueryString["id"]);
if (id == 0)
{
Response.Write(
"<script>alert('请选择相应的节点!');</script>");
}
else
{
DataTable dataTable
= SQLOperate.GetAreaInfoById(id);
int result = SQLOperate.AddParityClass(Convert.ToInt32(dataTable.Rows[0]["ParentId"].ToString()),
txtAreaName.Text.ToString().Trim());
if (result > 0)
Response.Write(
"<script>alert('添加成功!'); location.href='Default.aspx'; </script>");
}
}
/// <summary>
/// 添加子级地区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAddNextClass_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(Request.QueryString["id"]);
if (id == 0)
{
Response.Write(
"<script>alert('请选择相应的节点!');</script>");
}
else
{
DataTable dataTable
= SQLOperate.GetAreaInfoById(id);
int result = SQLOperate.AddNextClass(Convert.ToInt32(dataTable.Rows[0]["AreaId"].ToString()),
txtAreaName.Text.ToString().Trim());
if (result > 0)
Response.Write(
"<script>alert('添加成功!'); location.href='Default.aspx'; </script>");
}
}
}

 

DBHelper类

 

代码
/// <summary>
///DBHelper 的摘要说明
/// </summary>
public static class DBHelper
{
private static SqlConnection connection;
public static SqlConnection Connection
{
get
{
//读配置文件
// string connectionString = ConfigurationManager.ConnectionStrings["数据库名"].ConnectionString.ToString();
string connectionString = "server=服务器;database=数据库名;uid=sa;pwd=sa";

if (connection == null)
{
connection
= new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}

public static int ExecuteCommand(string safeSql)
{
SqlCommand cmd
= new SqlCommand(safeSql, Connection);
int result = cmd.ExecuteNonQuery();
return result;
}

public static int ExecuteCommand(string sql, SqlParameter[] values)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
return cmd.ExecuteNonQuery();
}

public static int ExecuteCommand(string sql, SqlParameter value)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.Add(value);
int result = cmd.ExecuteNonQuery();
return result;
}


public static int ExecuteScalar(string safeSql)
{
SqlCommand cmd
= new SqlCommand(safeSql, Connection);
int result = (int)cmd.ExecuteScalar();
return result;
}

public static int ExecuteScalar(string sql, SqlParameter[] values)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
int result = (int)cmd.ExecuteScalar();
return result;
}

public static int ExecuteScalar(string sql, SqlParameter value)
{
int result = 0;
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.Add(value);
try
{
result
= (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
result
= 0;
}
return result;
}

public static SqlDataReader ExecuteReader(string safeSql)
{
SqlCommand cmd
= new SqlCommand(safeSql, Connection);
SqlDataReader reader
= cmd.ExecuteReader();
return reader;
}

public static SqlDataReader ExecuteReader(string sql, SqlParameter value)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.Add(value);
SqlDataReader reader
= cmd.ExecuteReader();
return reader;
}

public static SqlDataReader ExecuteReader(string sql, SqlParameter[] values)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
SqlDataReader reader
= cmd.ExecuteReader();
return reader;
}
public static DataTable GetDataSet(string safeSql)
{
DataSet ds
= new DataSet();
SqlCommand cmd
= new SqlCommand(safeSql, Connection);
SqlDataAdapter da
= new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
}

public static DataTable GetDataSet(string sql, params SqlParameter[] values)
{
DataSet ds
= new DataSet();
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
SqlDataAdapter da
= new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
}





public static SqlDataReader GetReader(string safeSql)
{
SqlCommand cmd
= new SqlCommand(safeSql, Connection);
SqlDataReader reader
= cmd.ExecuteReader();
return reader;
}

public static SqlDataReader GetReader(string sql, params SqlParameter[] values)
{
SqlCommand cmd
= new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
SqlDataReader reader
= cmd.ExecuteReader();
return reader;
}
}

 

此程序只为入门者参考,如果更好的实现,欢迎留言补充,共同学习...

posted on 2010-04-20 17:53  不是吧  阅读(8903)  评论(5编辑  收藏  举报