项目里用到了,觉得有必要记下来,不然琢磨了半天的成果又忘记了,控件用的是RAD TREE VIEW,理论都是相通的
CS端代码:首先是递归函数主体,先查找子目录,加为节点,再查找每个子目录下的文件,加为节点
protected void BuildDirectoryTree(RadTreeNode parentNode)
{
// Handle Directories
var directories = Directory.GetDirectories(parentNode.Value).Select(d => new RadTreeNode() { Text = d.Substring(d.LastIndexOf("\\")+1), Value = d });
foreach (var directory in directories)
{
BuildDirectoryTree(directory);
parentNode.Nodes.Add(directory);
}
// Handle Files
var files = Directory.GetFiles(parentNode.Value).Select(f => new RadTreeNode() { Text = f.Substring(f.LastIndexOf("\\") + 1), Value = f });
parentNode.Nodes.AddRange(files);
}
然后是调用,我直接拿项目里的做例子了:
protected void lbtnAddTemplate_Click(object sender, EventArgs e)
{
string quoteNo = Request.QueryString["QuoteNo"];
HyperLink hlTemplateQuoteFolder = (HyperLink)quoteView.FindControl("hlTemplateQuoteFolder");
RadTreeView rtvTemplateFilesList = (RadTreeView)quoteView.FindControl("rtvTemplateFilesList");
if (!string.IsNullOrEmpty(quoteNo))
{
if (Directory.Exists(strTemplatePath))
{
RadTreeNode rootNode = new RadTreeNode { Text = "Templates", Value = strTemplatePath };
BuildDirectoryTree(rootNode);
rtvTemplateFilesList.Nodes.Add(rootNode);
}
}
}
TREE VIEW看起来像这样,然后当用户选中了他们要的文件后,选择添加会把这些文件拷到特定目录下(维持现在的位置)
protected void btnAddNewTemplate_Click(object sender, EventArgs e)
{
string message = string.Empty;
RadTreeView rtvTemplateFilesList = (RadTreeView)quoteView.FindControl("rtvTemplateFilesList");
IList<RadTreeNode> fileLst = rtvTemplateFilesList.CheckedNodes;
// Create a QuoteNo folder
if (!string.IsNullOrEmpty(QuoteNo))
{
string quotePath = Path.Combine(quoteRootPath, QuoteNo);
// Check if the directory exists, if not then create it
if (!Directory.Exists(quotePath))
{
Directory.CreateDirectory(quotePath);
}
// Go through the list and copy all the files
foreach (var item in fileLst)
{
if (File.Exists(item.Value))
{
string relativeFolder = item.Value.Remove(item.Value.LastIndexOf("\\"));
if (relativeFolder.LastIndexOf("\\") < relativeFolder.Length - 1)
{
relativeFolder += "\\";
}
relativeFolder = relativeFolder.Replace(strTemplatePath, "");
string destinationFolder = Path.Combine(quotePath, relativeFolder);
if (!Directory.Exists(destinationFolder))
{
Directory.CreateDirectory(destinationFolder);
}
File.Copy(item.Value, Path.Combine(destinationFolder, item.Text),true);
}
}
}
//hide the panel
System.Diagnostics.Process.Start(@"c:\");
AjaxControlToolkit.ModalPopupExtender mpAddNewTemplate = (AjaxControlToolkit.ModalPopupExtender)quoteView.FindControl("mpAddNewTemplate");
mpAddNewTemplate.Hide();
Response.Redirect("QuoteDetails.aspx?QuoteNo=" + QuoteNo);
}
如果想把整个FOLDER包括里面所有东西拷贝到另一个地方的话,有一个METHOD更简单:
protected void copyDirectory(string Src, string Dst)
{
// Copy directory structure recursively
String[] Files;
if (Dst[Dst.Length - 1] != Path.DirectorySeparatorChar)
Dst += Path.DirectorySeparatorChar;
if (!Directory.Exists(Dst)) Directory.CreateDirectory(Dst);
Files = Directory.GetFileSystemEntries(Src);
foreach (string Element in Files)
{
// Sub directories
if (Directory.Exists(Element))
copyDirectory(Element, Dst + Path.GetFileName(Element));
// Files in directory
else
File.Copy(Element, Dst + Path.GetFileName(Element), true);
}
}
ASPX端代码:
<asp:Panel ID="pnlAddNewTemplate" runat="server" Width="280px" Height="200px" CssClass="popup">
<asp:UpdatePanel ID="updPnlAddNewContact" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="contact-inline">
<span>Quote Folder - </span>
<asp:HyperLink ID="hlTemplateQuoteFolder" runat="server" /></div>
<telerik:RadTreeView ID="rtvTemplateFilesList" runat="server" CheckBoxes="true" OnClientNodeChecked="AfterCheck">
</telerik:RadTreeView>
<asp:Label ID="test" runat="server" />
<div class="contact-inline">
<asp:Button ID="btnAddNewTemplate" runat="server" Text="Add Template" OnClick="btnAddNewTemplate_Click" />
<asp:Button ID="btnCancelNewTemplate" runat="server" Text="Cancel" OnClick="btnCancelNewTemplate_Click" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
还要在旁边加上一个JAVA SCRIPT的函数,用来监测当CHILD NODE被选中的话,PARENT NODE也要被同时选上
<%--If the node is checked, the childs of this node will also be checked--%>
<script type="text/javascript">
//<!--
function UpdateAllChildren(nodes, checked)
{
for (var i=0; i < nodes.get_count(); i++)
{
var node = nodes.getNode(i);
node.set_checked(checked);
UpdateAllChildren(node.get_nodes(), checked);
}
}
function AfterCheck(treeView, args)
{
var node = args.get_node();
if (!node.get_checked() && node.get_parent() != treeView)
{
node.get_parent().set_checked(false);
}
// if(node.get_checked())
// {
// node.get_parent().set_checked(true);
// }
var siblingNodes = node.get_parent().get_nodes();
var allChecked = true;
for (var i = 0; i < siblingNodes.get_count(); i++)
{
var siblingNode = siblingNodes.getNode(i);
if (!siblingNode.get_checked())
{
allChecked = false;
break;
}
}
if (allChecked && node.get_parent() != treeView)
{
node.get_parent().set_checked(true);
}
UpdateAllChildren(node.get_nodes(), node.get_checked());
}
//-->
</script>
最后么,你可以在WEB.config里面预设文件夹的位置
<appSettings>
<add key="ShowCustomErrors" value="false"/>
<add key="FolderPath" value="c:\test\"/>
<!-- root path of dst folders -->
<add key="TemplatePath" value="c:\template\"/>
<!-- root path of tempaltes -->
</appSettings>
Currently rated 5.0 by 1 people
- Currently 5/5 Stars.
- 1
- 2
- 3
- 4
- 5