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)); }