- PR -

TreeViewにディレクトリを一覧で表示する

1
投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-02-06 15:23
お世話になります。

TreeView にあるフォルダー以下のフォルダーを表示しようと思い下記のようにしましたが、階層1つ下はOKですがその下(2つ下)が表示できません。
TreeView1_SelectedNodeChanged1() が呼ばれた時に、1つ下は、OKですが2つ下のときnull になっています。どこがおかしいのでしょうか?教えてください。

下記は、 Page_load() から
string _virtualImageRoot = string.Empty;
DirectoryInfo rootFolder = new DirectoryInfo(Server.MapPath(_virtualImageRoot));
DirectorySearch(/*rootFolder.FullName*/"C:\\");
で呼んでいます。ルートでも現フォルダー以下でも同じです。
コード:

例」
C:\\
|
-abc -> OK
|
- xxxx -> 表示できない



ASP.NET2.0 C# VS2005

コード:

protected void TreeView1_SelectedNodeChanged1(object sender, EventArgs e)
{
TreeView tv = (TreeView)sender;

string path = tv.SelectedValue;

if (System.IO.Directory.Exists(path)) {
// 選択がディレクトリの時
Int64 fSize = FileSearch(path, tv.SelectedNode);
}
}

private void DirectorySearch(string drive)
{
TreeNode masterNode = new TreeNode(drive);
TreeView1.Nodes.Add(masterNode);

sring[] directories = System.IO.Directory.GetDirectories(drive);
foreach (string st in directories) {
try {
TreeNode childNode = new TreeNode(st);
masterNode.ChildNodes.Add(childNode);
}
catch (System.UnauthorizedAccessException u) {
Console.WriteLine(u.ToString());
}
}
masterNode.Expand();
}

private Int64 FileSearch(string path, TreeNode masterNode)
{
Int64 fSize = 0;
int fNum = 0;

if (System.IO.Directory.Exists(path)) // 選択がディレクトリの場合のみ
{
string[] directories = System.IO.Directory.GetDirectories(path);
foreach (string st in directories){
try {
TreeNode childNode = new TreeNode(st);
masterNode.ChildNodes.Add(childNode);
++fNum;
}
catch (System.UnauthorizedAccessException u) {
Console.WriteLine(u.ToString());
}
}

masterNode.Expand();

if (fNum == 0 && fSize == 0)
fSize = -1; // ファイルもフォルダーもない

return fSize;
}
return -1;
}



[ メッセージ編集済み 編集者: SL 編集日時 2009-02-06 15:24 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-06 16:00
Web アプリケーションですよね?
あと VS2005 でしょうか。
こちらでは動きましたが・・・。

まさか
TreeView1_SelectedNodeChanged1 の末尾の「1」が関係しているとか
型名が「sring」となっている箇所のせいだとか言わないですよね・・・。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2009-02-06 16:18
こんにちわ。

ちょっと気になるんですが・・・
どういう仕様なんでしょう?

クリックしたら、一階層下のディレクトリ等の一覧が表示されるなら、Kingさんのおっしゃるとおりできていると思います。
初期表示でディレクトリ階層をすべて表示するならできていないと思います。

引用:

TreeView にあるフォルダー以下のフォルダーを表示しようと思い下記のようにしましたが、階層1つ下はOKですがその下(2つ下)が表示できません。


どのような操作をしたときにうまく表示できないのか、
ご説明いただいたほうが良いかと思います。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-02-06 16:27
お世話になります。

> こちらでは動きましたが・・・。
すみません。「そのさらに下が表示しません。」の間違いでした。

> TreeView1_SelectedNodeChanged1 の末尾の「1」が関係しているとか
これは、このハンドらが呼ばれているのでいいと思います。

> 型名が「sring」となっている ->[string]
は、パス名取得で、うまく開くときは、パス名が正しく取得できています。
失敗するときは、null になっています。

アプリケーション上の表示は、[defg]をクリックすると[abc]表示に戻ってしまう。
コード:

C:\\
|
-abc -> OK
|
- defg -> OK
|
- xxxx -> 表示できない




> 初期表示でディレクトリ階層をすべて表示するならできていないと思います
結果としてすべての階層を取得したいのですが、実際表示するのは、このアプリが動いているフォルダー「親として」それ以下すべてのサブです。クリックでExpandしたい。


[ メッセージ編集済み 編集者: SL 編集日時 2009-02-06 16:30 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-02-06 16:29
引用:

SLさんの書き込み (2009-02-06 15:23) より:


ちなみにそのコードだと、
1. あるフォルダを選択
2. 別のフォルダを選択
3. もう一度、1.のフォルダを選択

の操作で子ノードがどんどん増えていきますね。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-06 17:09
こちらでは4階層下の末端のフォルダまで表示されましたが・・・。
ただし展開していくたびにルートフォルダのノードが一番下にどんどん追加されていきます。

あと気になる事。
・フォルダが表示されないタイミングのデバッグを1行1行見ていってもわからないのか。
・フォルダ名のせいではないか。(HTML Encoding的な)
・「そのさらに下が表示しません。」の「そのさらに下」にはフォルダが存在しないのではないか。
・展開するたびに増えるルートフォルダのノードを見ているのではないか。

実際こちらでは動いているので環境の違いだとしか思えません。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-02-06 21:34
お世話になります。

> 展開していくたびにルートフォルダのノードが一番下にどんどん追加されていきます
この言葉をヒントに理由がわかりました。
ポストバック時に毎回呼ばれていることが原因のようです。下記のようにすることで下の階層まで表示するようになりました。こちらの環境では、一番下にどんどん追加されると言ったことが起きなくて見た目変化がなかったため気づきませんでした。
環境は、ASP.NET2.0 C# VS2005 パソコンは、Vista sp1 です。

うまくいったのですが、これを見栄え良くするため各階層化のノードを単一のフォルダー名にしたいのですがどうしたらいいでしょうか?
今は、どのノードもフルパスでとても見ずらいです。
今の仕様だとノードを取得して文字列に変換し次を探しています。同じものを List か Array などに保管して作業すべき?ノードからパスをつなぎ合わせるの?
通常のやり方を教えてください。お願いします。

コード:
if (!IsPostBack)
    {
       TreeView1.Nodes.Clear();

       string _virtualImageRoot = string.Empty;
       DirectoryInfo rootFolder = new DirectoryInfo(Server.MapPath(_virtualImageRoot));
       DirectorySearch(/*rootFolder.FullName*/"C:\\");
    }

1

スキルアップ/キャリアアップ(JOB@IT)