文件递归XML递归树图递归.docx
《文件递归XML递归树图递归.docx》由会员分享,可在线阅读,更多相关《文件递归XML递归树图递归.docx(15页珍藏版)》请在冰豆网上搜索。
![文件递归XML递归树图递归.docx](https://file1.bdocx.com/fileroot1/2022-11/22/3597a8d4-9372-42f4-90ec-fde65699b891/3597a8d4-9372-42f4-90ec-fde65699b8911.gif)
文件递归XML递归树图递归
常见的三种递归介绍:
FileSystem、XML、TreeView2
一、文件系统递归2
★详细代码如下:
2
二、树图递归—数据表多层关系5
★详细代码如下:
6
三、XML文件递归9
★详细代码如下:
11
常见的三种递归介绍:
FileSystem、XML、TreeView
面试中经常遇到的三种递归:
文件系统递归、XML递归、树图TreeView递归。
以下代码开发语言:
C#,属于Windows简单应用程序。
希望对初进入职场的求职者有所帮助。
一、文件系统递归
在VisualStudio2005中新建项目Windows应用程序:
命名为RecursionDemo
//在默认的Form1窗体加入三个控件Button:
btnSearch,TreeView:
tvFiles,ImageList:
imageList1
//设置tvFiles.ImageList=imageList1;
//为imageList1添加3个图片
★详细代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
namespaceRecursionDemo
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
///
///查询按钮的Click事件绑定TreeView
///
///
///
privatevoidbtnSearch_Click(objectsender,EventArgse)
{
tvFiles.Nodes.Clear();//清空节点
//用户选择文件夹获得选择的文件夹的路径
FolderBrowserDialogfbd=newFolderBrowserDialog();
if(fbd.ShowDialog()==DialogResult.OK)
{
TreeNoderootNode=newTreeNode();
rootNode.Text=Path.GetFileName(fbd.SelectedPath);
rootNode.ImageIndex=0;
rootNode.SelectedImageIndex=1;
tvFiles.Nodes.Add(rootNode);
//SearchFiles(rootNode.Nodes,fbd.SelectedPath);
SearchFilesMutation(rootNode,fbd.SelectedPath);//用上面一行代//码也可以
tvFiles.SelectedNode=rootNode;
}
else
{
MessageBox.Show("没有选择文件夹或目录!
","提示");
}
}
///
///查询文件和所有文件夹(目录)
///思路:
.获得目录path下的所有子文件夹(子目录)、获得目录path下的所有文//件
///2.如果是子目录,添加该子目录路径到TreeNodeCollection,继续递归子目录;
///3.如果是文件,则只需添加文件路径到TreeNodeCollection
///
///树节点集合
///当前文件夹路径
privatevoidSearchFiles(TreeNodeCollectionnodes,stringpath)
{
string[]folders=Directory.GetDirectories(path);//获取path文件夹下//所有的子文件夹
foreach(stringfolderPathinfolders)
{
TreeNodetempNode=newTreeNode();
tempNode.Text=Path.GetFileName(folderPath);
intcurrentIndex=nodes.Add(tempNode);
nodes[currentIndex].ImageIndex=0;//树节点未选中时的图//片
nodes[currentIndex].SelectedImageIndex=1;//树节点处于选中时的//图片
//如果tempNode存在子目录继续遍历
SearchFiles(tempNode.Nodes,folderPath);//这里递归
}
string[]files=Directory.GetFiles(path);//获取path文件夹下所有的文//件
foreach(stringfilePathinfiles)
{
TreeNodenode=nodes.Add(Path.GetFileName(filePath));
node.ImageIndex=2;
node.SelectedImageIndex=2;
}
}
///
///查询文件和文件夹的另一种方法,和SearchFiles方法原理一致
///
///当前树节点
///当前树节点(目录)的路径
privatevoidSearchFilesMutation(TreeNodenode,stringpath)
{
//获取path下的所有文件和目录组成一个string数组数组元素为物理路径
string[]fileAndFolders=Directory.GetFileSystemEntries(path);
foreach(stringfileOrFolderPathinfileAndFolders)
{
if(Directory.Exists(fileOrFolderPath))//如果是目录(文件夹)
{
TreeNodetempNode=newTreeNode();
tempNode.Text=Path.GetFileName(fileOrFolderPath);
intcurrentIndex=node.Nodes.Add(tempNode);
node.Nodes[currentIndex].ImageIndex=0;//树节点未选//中时的图片
node.Nodes[currentIndex].SelectedImageIndex=1;//树节点处于//选中时的图片
//如果tempNode存在子目录继续遍历
SearchFilesMutation(tempNode,fileOrFolderPath);//这里递归
}
else//如果是文件即:
File.Exists(fileOrFolderPath)
{
TreeNodecurrentNode=node.Nodes.Add(Path.GetFileName(fileOrFolderPath));
currentNode.ImageIndex=2;
currentNode.SelectedImageIndex=2;
}
}
}
}
}
运行程序。
点击按钮,选择一个文件夹,效果如下图(文件夹选中和未选中时的图标不同):
二、树图递归—数据表多层关系
以Sqlserver数据库的一张部门表Department为例,查询显示所有的部门,并按从属关系绑定到树图上。
在SqlServer中,新建部门表Department,sql语句如下:
CREATETABLE[Department](
[DepartmentNo][varchar](12)COLLATEChinese_PRC_CI_ASNOTNULL,
[ParentNo][varchar](12)COLLATEChinese_PRC_CI_ASNULL,
[DepartmentName][nvarchar](30)COLLATEChinese_PRC_CI_ASNOTNULL,
[Remark][nvarchar](200)COLLATEChinese_PRC_CI_ASNULL,
CONSTRAINT[PK_Department]PRIMARYKEYCLUSTERED
(
[DepartmentNo]
)ON[PRIMARY]
)ON[PRIMARY]
---当ParentNo为null时,即没有父部门(上一级部门),我们认为是顶级部门。
添加数据到Department。
如下:
在项目RecursionDemo下,添加Windows窗体Form2,在Form2上添加两个控件
Button:
btnExamineDepartment,TreeView:
tvDepartment
★详细代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Data.SqlClient;
namespaceRecursionDemo
{
publicpartialclassForm2:
Form
{
publicForm2()
{
InitializeComponent();
}
///
///查看所有部门并绑定到树图上
///
///
///
privatevoidbtnExamineDepartment_Click(objectsender,EventArgse)
{
tvDepartment.Nodes.Clear();
try
{
DataTabledtTopDepartment=GetTopDepartemnt();//获得最顶级部门
//调用递归方法
BindTreeView(tvDepartment.Nodes,dtTopDepartment);
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message,"异常信息");
}
}
///
///绑定树图用到的递归方法
///思路:
查看Datatable的所有部门,绑定到树图上,形成多个TreeNode
///2.将生成的每一个TreeNode的Text属性设置为DepartmentName,将TreeNode的///Tag属性设置为DepartmentNo
///3.查看每一个TreeNode,看是否存在子部门(DataTable的数据行大于,父节点///就是当前的Tag)
///4.如果存在子部门继续递归遍历
///
///节点集合
///当前DataTable
privatevoidBindTreeView(TreeNodeCollectionnodes,DataTabledt)
{
foreach(DataRowdrindt.Rows)
{
TreeNodetempNode=newTreeNode();
tempNode.Text=dr["DepartmentName"].ToString();
tempNode.Tag=dr["DepartmentNo"].ToString();
nodes.Add(tempNode);
DataTabletempTable=GetSubDepartment(dr["DepartmentNo"].ToString());
//上一行代码也可写成:
//DataTabletempTable=//GetSubDepartment(tempNode.Tag.ToString());
if(tempTable.Rows.Count>0)//如果存在子部门
{
BindTreeView(tempNode.Nodes,tempTable);//这里进行递归寻找//子部门
}
}
}
///
///获得下一级直属子部门
///
///父部门编号
///
privateDataTableGetSubDepartment(stringparentNo)
{
SqlConnectionconn=newSqlConnection();
//根据实际情况写出自己的SqlServer数据库连接字符串
conn.ConnectionString=@"
DataSource=LENOVO-YANGLQ\YLQTEST;initialcatalog=ICChannels;userid=sa;password=123456";
stringsql="selectDepartmentNo,DepartmentNamefromDepartmentwhereParentNo=@ParentNo";
SqlParameterparameter=newSqlParameter("@ParentNo",SqlDbType.VarChar,12);
parameter.Value=parentNo;
SqlCommandcommand=newSqlCommand(sql,conn);
command.Parameters.Add(parameter);
SqlDataAdapteradapter=newSqlDataAdapter();
adapter.SelectCommand=command;
DataSetds=newDataSet();
conn.Open();
adapter.Fill(ds);
conn.Close();
returnds.Tables[0];
}
///
///获得最顶级部门,即没有父节点(ParentNoisnull)
///
///
privateDataTableGetTopDepartemnt()
{
SqlConnectionconn=newSqlConnection();
conn.ConnectionString=@"
DataSource=LENOVO-YANGLQ\YLQTEST;initialcatalog=ICChannels;userid=sa;password=123456";
stringsql="selectDepartmentNo,DepartmentNamefromDepartmentwhereParentNoisnull";
SqlDataAdapteradapter=newSqlDataAdapter(sql,conn);
DataSetds=newDataSet();
conn.Open();
adapter.Fill(ds);
conn.Close();
returnds.Tables[0];
}
}
}
点击按钮,运行效果如下图:
三、XML文件递归
查看一个XML文件,并按父节点与子节点的归属关系绑定到树图上。
(XML文件有且只有一个根节点)
一个xml文件(命名为test.xml)的内容如下:
xmlversion="1.0"encoding="gb2312"?
>
流水号
企业编码
认证码
时间戳
用户开户
|
流水号1
开户卡号1
手机号1
工单处理结果:
1
操作成功
|
流水号2
开户卡号2
手机号2
工单处理结果:
99
操作失败
|
流水号3
开户卡号3
手机号3
工单处理结果:
0
操作失败
|
字段1
卡号
字段2
古剑奇谭
XML解析响应码
响应码
在项目RecursionDemo下,添加Windows窗体Form3,在Form3上添加两个控件
Button:
btnExamineXml,TreeView:
tvXml
★详细代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Xml;
namespaceRecursionDemo
{
publicpartialclassForm3:
Form
{
publicForm3()
{
InitializeComponent();
}
privatevoidbtnExamineXml_Click(objectsender,EventArgse)
{
tvXml.Nodes.Clear();
XmlDocumentdocument=newXmlDocument();
//填写自己所建的test.xml的路径
stringfileName=@"D:
\test.xml";
try
{
document.Load(fileName);
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message,"异常信息");
return;
}
//XmlElement继承于类XmlNode
TreeNoderootNode=newTreeNode();
rootNode.Text=document.DocumentElement.Name;
tvXml.Nodes.Add(rootNode);
BindXml(rootNode.Nodes,document.DocumentElement);
}
///
///递归方法
///思路:
1.查看node下的所有子节点
///2.将子节点绑定到TreeNode上,如果子节点存在属性,将属性页显示出来
///3.如果subNode存在子节点继续递归遍历
///
///树节点集合
///XML的一个节点
privatevoidBindXml(TreeNodeCollectionnodes,XmlNodenode)
{
foreach(XmlNodesubNodeinnode.ChildNodes)
{
stringtext="";
if(subNode.Value==null)//如果节点值不存在
{
if(subNode.Attributes!
=null&&subNode.Attributes.Count>0)
{
text+=subNode.Name+"--属性有:
";
for(inti=0;i{
text+=subNode.Attributes[i].Name+":
"+subNode.Attributes[i].Value+"";
}
}
else