文件递归XML递归树图递归文档格式.docx
- 文档编号:16311404
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:15
- 大小:141.42KB
文件递归XML递归树图递归文档格式.docx
《文件递归XML递归树图递归文档格式.docx》由会员分享,可在线阅读,更多相关《文件递归XML递归树图递归文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
namespaceRecursionDemo
{
publicpartialclassForm1:
Form
{
publicForm1()
InitializeComponent();
}
///<
summary>
///查询按钮的Click事件绑定TreeView
/summary>
paramname="
sender"
>
<
/param>
e"
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
nodes"
树节点集合<
path"
当前文件夹路径<
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方法原理一致
node"
当前树节点<
当前树节点(目录)的路径<
privatevoidSearchFilesMutation(TreeNodenode,stringpath)
//获取path下的所有文件和目录组成一个string数组数组元素为物理路径
string[]fileAndFolders=Directory.GetFileSystemEntries(path);
foreach(stringfileOrFolderPathinfileAndFolders)
if(Directory.Exists(fileOrFolderPath))//如果是目录(文件夹)
tempNode.Text=Path.GetFileName(fileOrFolderPath);
intcurrentIndex=node.Nodes.Add(tempNode);
node.Nodes[currentIndex].ImageIndex=0;
//树节点未选//中时的图片
node.Nodes[currentIndex].SelectedImageIndex=1;
//树节点处于//选中时的图片
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.Data.SqlClient;
publicpartialclassForm2:
publicForm2()
///查看所有部门并绑定到树图上
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.如果存在子部门继续递归遍历
节点集合<
dt"
当前DataTable<
privatevoidBindTreeView(TreeNodeCollectionnodes,DataTabledt)
foreach(DataRowdrindt.Rows)
tempNode.Text=dr["
DepartmentName"
].ToString();
tempNode.Tag=dr["
DepartmentNo"
nodes.Add(tempNode);
DataTabletempTable=GetSubDepartment(dr["
].ToString());
//上一行代码也可写成:
//DataTabletempTable=//GetSubDepartment(tempNode.Tag.ToString());
if(tempTable.Rows.Count>
0)//如果存在子部门
BindTreeView(tempNode.Nodes,tempTable);
//这里进行递归寻找//子部门
///获得下一级直属子部门
parentNo"
父部门编号<
returns>
/returns>
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()
selectDepartmentNo,DepartmentNamefromDepartmentwhereParentNoisnull"
SqlDataAdapteradapter=newSqlDataAdapter(sql,conn);
点击按钮,运行效果如下图:
三、XML文件递归
查看一个XML文件,并按父节点与子节点的归属关系绑定到树图上。
(XML文件有且只有一个根节点)
一个xml文件(命名为test.xml)的内容如下:
?
xmlversion="
1.0"
encoding="
gb2312"
?
ROOT>
<
SerialNumber>
流水号<
/SerialNumber>
EnterpriseId>
企业编码<
/EnterpriseId>
Authenticator>
认证码<
/Authenticator>
TimeStamp>
时间戳<
/TimeStamp>
EncryptBody>
Action>
用户开户<
/Action>
DATAattributeId="
1"
attributeName="
这是属性"
ROW>
reqID>
流水号1<
/reqID>
cardID>
开户卡号1<
/cardID>
mobileNO>
手机号1<
/mobileNO>
result>
工单处理结果:
1<
/result>
errName>
操作成功<
/errName>
/ROW>
流水号2<
开户卡号2<
手机号2<
99<
操作失败<
流水号3<
开户卡号3<
手机号3<
0<
Field1>
字段1<
/Field1>
CARDID>
卡号<
/CARDID>
Field2>
字段2<
/Field2>
Gjqt>
古剑奇谭<
/Gjqt>
/DATA>
/EncryptBody>
RootResult>
XML解析响应码<
/RootResult>
RootErrName>
响应码<
/RootErrName>
/ROOT>
在项目RecursionDemo下,添加Windows窗体Form3,在Form3上添加两个控件
btnExamineXml,TreeView:
tvXml
usingSystem.Xml;
publicpartialclassForm3:
publicForm3()
privatevoidbtnExamineXml_Click(objectsender,EventArgse)
tvXml.Nodes.Clear();
XmlDocumentdocument=newXmlDocument();
//填写自己所建的test.xml的路径
stringfileName=@"
D:
\test.xml"
document.Load(fileName);
return;
//XmlElement继承于类XmlNode
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<
subNode.Attributes.Count;
i++)
text+=subNode.Attributes[i].Name+"
:
+subNode.Attributes[i].Value+"
"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 递归 XML