1. 【案例一】如下代码:
class Program
{
private static int index= 0;
static void Main(string[] args)
{
M1();
Console.ReadLine();
}
private static void M1()
{
Console.WriteLine("A");
if (index<3)
{
index++;
M1();
}
Console.WriteLine("B");
}
}
最终结果是:A A A A B B B B
总结:当每次调用其它方法还是自己,都会重新分配一个内存空间,执行完成之后,向上执行,一直到调用者【Main()】方法执行完成之后。
2. 【案例二】如下代码:
static void Main(string[] args)
{
M1(0);
Console.ReadLine();
}
====================================================================================================================
private static void M1(inti)
{
Console.WriteLine("A"+i);
i++;
if (i<3)
{
M1(i);
}
Console.WriteLine("B"+i);
}
结果是:
A0 A1 A2 B3 B2 B1
分析图如下:
3.【案例三】如下图:制作如下效果:【递归加载与删除】
【加载数据库中的数据】代码如下:
//加载数据库中的数据
private void button1_Click(objectsender, EventArgse)
{
int pid=0;
//1. 读取TblArea中的数据
LoadAreaInfo(pid,treeView1.Nodes);
}
//加载数据
private void LoadAreaInfo(intpid, TreeNodeCollection treeNodeCollection)
{
//1. 先执行查询,查询所有的AreaPid等于Pid的
string sql="select AreaId,AreaName from TblArea where AreaPid=@pid";
DataTable dt=SqlHelper.ExecuteDataTable(sql, CommandType.Text,new SqlParameter("@pid", pid));
//2. 把dt中的数据绑定到treeNodeCollection上
foreach (DataRow itemDr in dt.Rows)
{
TreeNode tnode=treeNodeCollection.Add(itemDr[1].ToString());
tnode.Tag=itemDr[0];
//读取河北下面的所有子城市,然后将这些数据绑定到tnode节点下
LoadAreaInfo((int)itemDr[0],tnode.Nodes);
}
}
【递归删除】代码如下:
private void button2_Click(objectsender, EventArgse)
{
//1. 获取当前选中节点
TreeNodenode=treeView1.SelectedNode;
if (node!=null)
{
//2. 根据当前选中节点获取AreaId
intareaId=Convert.ToInt32(node.Tag);
//===========执行递归删除==============
DeleteNodeDiGui(areaId);
//3. 执行删除
//把记录从数据库中删除
//普通的删除,只删除选中的那一条数据
//DeleteNode(areaId);
//从界面上把该节点也删除
node.Remove();
}
else
{
MessageBox.Show("请选中节点!");
}
} =======================================================================================================================================================
privatevoidDeleteNodeDiGui(intareaId)
{
//1. 先把areaId作为父Id,查询所有的子元素
stringsql="select AreaId from TblArea where AreaPid=@pid ";
DataTabledt=SqlHelper.ExecuteDataTable(sql, CommandType.Text, newSqlParameter("@pid", areaId));
//遍历查到的所有子元素集合dt,对于每一个查询到的子元素继续指向遍历与删除操作。
foreach (DataRowdrindt.Rows)
{
DeleteNodeDiGui((int)dr[0]);
}
//2. 将当前的areaId这条记录删除
DeleteNode(areaId);
}
=======================================================================================================================================================
//删除数据库中的数据
privatevoidDeleteNode(intareaId)
{
stringsql="delete from TblArea where areaId=@aid";
SqlHelper.ExcuteNonQuery(sql, CommandType.Text, newSqlParameter("@aid", areaId));
}