如何在页面后面的代码中创建文件夹

时间:2009-04-03 13:31:43

标签: asp.net directory

这是参考昨天的问题"How do I create folders in ASP.NET in code behind"。问题是我想在运行时创建动态文件夹。文件夹名称将通过TextBox输入,输出将显示在TreeView中。如果我在textbox1中输入第一个文件夹名称并单击“添加文件夹”按钮,表单将提交。当我提交具有相同名称的多个文件夹时,输出应该是名称的索引增量(例如,FooFolder,FooFolder(2),FooFolder(3)等)。有两个事件:添加文件夹事件和删除文件夹事件。如果我选择一个特定的子文件夹并单击“删除文件夹”按钮,该文件夹将被删除。为了添加文件夹,我编写了以下代码:

TreeNode tnode = new TreeNode();
if (TreeView1.Nodes.Count > 0)
        {
            int found = 0;
            for (int i = 0; i < TreeView1.Nodes.Count; i++)
            {
                if (TreeView1.Nodes[i].Text == TextBox1.Text)
                    found += 1+i;
            }
            if (found > 0)
            {
                tnode.Text = TextBox1.Text + found.ToString();
            }
            else
            {
                tnode.Text = TextBox1.Text;
            }
        }
        else
        {
            tnode.Text = TextBox1.Text;
        }
        TreeView1.Nodes.Add(tnode);
}

在我的代码中,ChildNode索引没有递增;总是1,像这样:

Sumit
Sumit(1)
Sumit(1)
Sumit(1)
Amit
Amit(5)
Amit(5)
Amit(5)

在树视图中,我设置了ImageSet="XPFileExplorer"。所以输出应该如下所示:

-Root
        -Sumit(Parent1)
                  NewFolder
                  NewFolder(2)
                  NewFolder(3)
                  NewFolder(4)
                  NewFolder(5)
         -Amit(Parent2)
                  FooFolder
                  FooFolder(2)
                  FooFolder(3)
                  FooFolder(4)
                  FooFolder(5)

如果删除任何子文件夹,例如Newfolder(3)和Newfolder(4)并在相同的Sumit(Parent1)下创建这些相同的文件夹,则索引应为Newfolder(3),Newfolder(4)。如果我在Sumit下创建一个具有相同名称的NewFolder,那么索引应该是NewFolder(6)。

有人可以修改我的代码以获得所需的输出吗?

3 个答案:

答案 0 :(得分:2)

这里的问题是你的算法来检测项目是否存在。基本上你的代码:

for (int i = 0; i < TreeView1.Nodes.Count; i++)            
{                
    if (TreeView1.Nodes[i].Text == TextBox1.Text)
                    found += 1+i;            
}
if (found > 0)            
{                
   tnode.Text = TextBox1.Text + found.ToString();      
}            
else            
{                
   tnode.Text = TextBox1.Text;            
}

让我们来看看这个。用户提交您的代码经过的NewFolder并且找不到任何名为NewFolder的节点,因此它将节点设置为NewFolder。

现在用户再次为NewFolder点击添加,这次它找到NewFolder,因此新名称变为NewFolder1。

现在用户再次为NewFolder点击添加,这次它找到NewFolder,因此新名称变为NewFolder1。

比较TreeView1.Nodes [i] .Text == TextBox1.Text,只有一个节点将拥有此名称。您需要去除名称的数字部分。

如果您使用像NewFolder(1)这样的命名约定,那么您可以轻松地执行此操作。但根据你所拥有的代码,节点的名称将是NewFolder1

答案 1 :(得分:1)

在您执行此操作之前,我了解到您不应该在正在运行的应用程序下创建/删除文件夹,或者您将导致应用程序池回收。因此,请确保您在服务器上的其他位置创建目录。 (希望你有这个访问权限)

答案 2 :(得分:1)

您的文字比较已关闭。由于您可能已将数字添加到同一父级下的先前节点,因此您只会遇到一次新名称。

应该看起来像:

if (TreeView1.Nodes[i].Text.StartsWith(TextBox1.Text))
    found++