2009-04-03 10 views
0

これは昨日の質問"How do I create folders in ASP.NET in code behind"を参照しています。問題は、実行時に動的フォルダを作成したいということです。フォルダ名はTextBoxを介して入力され、出力はTreeViewに表示されます。最初のフォルダ名をtextbox1に入力して[フォルダの追加]ボタンをクリックすると、フォームが送信されます。同じ名前の複数のフォルダを送信すると、出力は名前のインデックス付きインクリメント(FooFolder、FooFolder(2)、FooFolder(3)など)になります。フォルダイベントの追加とフォルダイベントの削除の2つのイベントがあります。特定の子フォルダを選択して[フォルダを削除]ボタンをクリックすると、そのフォルダが削除されます。フォルダを追加するために、私は次のコードを書いています:コードの後ろにフォルダを作成する方法

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) 

新規フォルダ(3)および新規フォルダを(4)と同じスミット(親1)の下でこれらの同じフォルダを作成し、インデックスはする必要がありますニューフォルダー(3)、ニューフォルダー(4)。同じ名前のSumitの下にもう1つのNewFolderを作成すると、そのインデックスはNewFolder(6)になります。

誰かがこの出力を得るために私のコードを変更してください。

答えて

1

これを実行する前に、実行中のアプリケーションの下でフォルダを作成/削除しないでください。そうしないと、アプリケーションプールがリサイクルされません。したがって、サーバー上の別の場所にディレクトリを作成していることを確認してください。 (うまくいけば、そのアクセス権を持っている)

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が見つかるため、新しい名前がNewFolder1になります。

ユーザーがNewFolderの追加を再度クリックすると、今回はNewFolderが見つかるため、新しい名前がNewFolder1になります。

TreeView1.Nodes [i] .Text == TextBox1.Textの場合は、1つのノードだけがこの名前を持つことになります。名前の数字部分を取り除く必要があります。

NewFolder(1)のような命名規則を使用している場合は、簡単にこれを行うことができます。しかし、そこにあるコードに基づいて、ノードの名前はNewFolder1になります

1

あなたのテキスト比較はオフです。同じ親の下にある以前のノードに番号を追加した可能性があるため、新しい名前が1回しか出現しません。

それは次のようになります。このコードは、私が6回シリーズはcoming.Jack、ジャック(1)、ジャック(3)、ジャックされたフォルダ名としてジャックを入力output.If希望与えていません

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

(6)、ジャック(10)、ジャック(15)は絶対に間違った出力です。 – user59637

+0

あなたの発見した数も修正するように編集しました。 – SirDemon

+0

あなたのコーディングサブフォルダのインデックスは1から始まっています。ここでは2で始める必要があります。例:Jackは親フォルダです。Michaelはサブフォルダで、Jack Michael、Michael(2)、Michael(3)、Michael(4) – user59637

関連する問題