C#递归实现Treeview

无意发现在网上很刚学C#的朋友们都在找关于C#如何递归实现TreeView的绑定,见网上很多例子都比较深奥,我特意写了个比较简单易懂的例子帮助大家了解C#TreeView的操作与递归的实现...

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

效果图:

2010042017415728.jpg

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

2010042017425446.jpg

二:创建AreaManage项目:

2010042017433286.jpg

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

1.1.SQLOperate.cs

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
/// <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)

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
<% @ 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):

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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 页面代码(只为显示效果,不曾考虑排版)

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
<% @ 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(后台代码)

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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类

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
/// <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;
}
}

 

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

转载于:https://www.cnblogs.com/xiao793/archive/2010/04/20/1716407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值