这是参考昨天的问题"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)。
有人可以修改我的代码以获得所需的输出吗?
答案 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++