C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

ツリービューのフォルダ表示名変更について /ポッチャマ (18/08/01(Wed) 13:49) #88078
Re[1]: ツリービューのフォルダ表示名変更について /Hongliang (18/08/01(Wed) 14:07) #88079
  └ Re[2]: ツリービューのフォルダ表示名変更について /ポッチャマ (18/08/01(Wed) 16:40) #88080
    └ Re[3]: ツリービューのフォルダ表示名変更について /Hongliang (18/08/01(Wed) 17:18) #88082
      └ Re[4]: ツリービューのフォルダ表示名変更について /ポッチャマ (18/08/02(Thu) 23:21) #88107


親記事 / ▼[ 88079 ]
■88078 / 親階層)  ツリービューのフォルダ表示名変更について
□投稿者/ ポッチャマ (1回)-(2018/08/01(Wed) 13:49:30)

分類:[C#] 

今ツリービューでフォルダを写し、
フォルダを選んだ際その中に入っているファイルを、リストビューに写す構文を作っているのですが、
ツリービューで写っている親フォルダ名の一部を消したいです。

例えば
コンボボックスから
C:\Users\ユーザー名\を選んだ場合、

C:\Users\ユーザー名\Documents
C:\Users\ユーザー名\Music
C:\Users\ユーザー名\Downloads

等がツリービューに並びますが、C:\Users\ユーザー名\を消して、
\Documents
\Music
だけ表示させたいです。

そこで色々調べてみると
LabelEditをTrueにして自分では消せるようになったのですが、下記問題が発生しました。

1、あるサイトにて、treeView1.Nodes("C:\Users\ユーザー名\").Text="";
のようにすると一斉に消せるとなっていたが、「Nodes」のところでエラーが出る。

2、フォルダ名をいじると子ノードが開けずエラーが出る。

この2つの問題を解決したいのですが、何か良い方法はないでしょうか?

教えていただけるとありがたいです。
よろしくお願いいたします。


public Form1()
{
InitializeComponent();
string[] Dir = Directory.GetDirectories(fPH ///他フォームのコンボボックスから選んだパス);
foreach (String GDir in Dir)
{
TreeNode node = new TreeNode(GDir);
node.Nodes.Add(new TreeNode());
treeView1.Nodes.Add(node);
}

}

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
TreeNode node = e.Node;
String path = node.FullPath;
node.Nodes.Clear();
try
{
DirectoryInfo dirList = new DirectoryInfo(node.FullPath);
foreach (DirectoryInfo fo in dirList.GetDirectories())
{
TreeNode child = new TreeNode(fo.Name);
child.Nodes.Add(new TreeNode());
node.Nodes.Add(child);
}
}
catch (Exception)
{
}

}
public void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
Item(e.Node.FullPath);
}
[ □ Tree ] 返信 編集キー/

▲[ 88078 ] / ▼[ 88080 ]
■88079 / 1階層)  Re[1]: ツリービューのフォルダ表示名変更について
□投稿者/ Hongliang (668回)-(2018/08/01(Wed) 14:07:52)
> DirectoryInfo dirList = new DirectoryInfo(node.FullPath);
> foreach (DirectoryInfo fo in dirList.GetDirectories())
> {
>     TreeNode child = new TreeNode(fo.Name);
こっちのコードみたいにDirectoryInfoとそのNameプロパティを使うように、
> string[] Dir = Directory.GetDirectories(fPH ///他フォームのコンボボックスから選んだパス);
> foreach (String GDir in Dir)
> {
>     TreeNode node = new TreeNode(GDir);
こっちのコードも変更したらいいと思います。

> 1、あるサイトにて、treeView1.Nodes("C:\Users\ユーザー名\").Text="";
> のようにすると一斉に消せるとなっていたが、「Nodes」のところでエラーが出る。
VBのコードですね。
C#では .Nodes["..."] のように角括弧でアクセスします。
でも今回の目的において何に使うコードでしょうか……?


> 2、フォルダ名をいじると子ノードが開けずエラーが出る。
各TreeNodeはTagプロパティを持っていて、ここに任意の値を置いておくことができます。
今回の場合であれば、ここにDirectoryInfoを設定すると便利そうです。

// 設定する
foreach (DirectoryInfo fo in dirList.GetDirectories())
{
    TreeNode child = new TreeNode(fo.Name);
    child.Tag = fo;
    略
}

// 使う
var dir = (DirectoryInfo)e.Node.Tag;
Debug.Print(dir.FullName);

[ 親 88078 / □ Tree ] 返信 編集キー/

▲[ 88079 ] / ▼[ 88082 ]
■88080 / 2階層)  Re[2]: ツリービューのフォルダ表示名変更について
□投稿者/ ポッチャマ (3回)-(2018/08/01(Wed) 16:40:55)
No88079 (Hongliang さん) に返信

>>1、あるサイトにて、treeView1.Nodes("C:\Users\ユーザー名\").Text="";
>>のようにすると一斉に消せるとなっていたが、「Nodes」のところでエラーが出る。
> VBのコードですね。
> C#では .Nodes["..."] のように角括弧でアクセスします。
> でも今回の目的において何に使うコードでしょうか……?

このコードで一括で各フォルダに付いているC:\Users\ユーザー名\を消せると思ったのですが。。
実際に[] にして今入れてみたら全く消えず・・
この文は消せる構文ではないのですか??

>>2、フォルダ名をいじると子ノードが開けずエラーが出る。
> 各TreeNodeはTagプロパティを持っていて、ここに任意の値を置いておくことができます。
> 今回の場合であれば、ここにDirectoryInfoを設定すると便利そうです。
>
> // 設定する
> foreach (DirectoryInfo fo in dirList.GetDirectories())
> {
> TreeNode child = new TreeNode(fo.Name);
> child.Tag = fo;
> 略
> }
>
> // 使う
> var dir = (DirectoryInfo)e.Node.Tag;
> Debug.Print(dir.FullName);


このdirの使い方ですが、
ツリービューをクリックした後、
リストビューには下記のように表示させていくのですが、
どのように使うのですか?

理解できず申し訳ありません。。
詳しく教えていただけると幸いです。

public void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
Item(e.Node.FullPath);
}
private void Item(String filePath)
{
// リストビューのヘッダーを設定
listView1.Columns.Add("名前");
listView1.Columns.Add("更新日時");
listView1.Columns.Add("サイズ");

try
{

List<String> files = Directory.GetFiles(filePath).ToList<String>();
foreach (String file in files)
{
FileInfo info = new FileInfo(file);
ListViewItem item = new ListViewItem(info.Name);
item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", info.LastAccessTime));
item.SubItems.Add(getFileSize(info.Length));
listView1.Items.Add(item);
}
}
catch (Exception)
{
}
}


[ 親 88078 / □ Tree ] 返信 編集キー/

▲[ 88080 ] / ▼[ 88107 ]
■88082 / 3階層)  Re[3]: ツリービューのフォルダ表示名変更について
□投稿者/ Hongliang (669回)-(2018/08/01(Wed) 17:18:33)
> このコードで一括で各フォルダに付いているC:\Users\ユーザー名\を消せると思ったのですが。。
> 実際に[] にして今入れてみたら全く消えず・・
> この文は消せる構文ではないのですか??

.Nodes["XXX"] は、配下のノードの中から XXX という値のNameプロパティを持ったノードを取得するものです。
Nameプロパティは明示的に設定しない限りnullなので、多分何も見つけられません。

TreeNode node = new TreeNode("hoge") { Name = "name" };
treeView1.Nodes.Add(node);
treeView1.Nodes["name"].Text = "fuga";
// hogeがfugaに変更される

なので今回は全く関係ないと考えていいかと。

> このdirの使い方ですが、
> ツリービューをクリックした後、
> リストビューには下記のように表示させていくのですが、
> どのように使うのですか?

> public void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
> {
> Item(e.Node.FullPath);
> }
ここで、e.Node.FullPathの代わりに、DirectoryInfoのFullNameを渡せばいいんじゃないでしょうか。
あるいはどうせItemメソッドではディレクトリの中のファイルを列挙したりするわけで、DirectoryInfoを引数にして、そのまま渡してもいいでしょう。
[ 親 88078 / □ Tree ] 返信 編集キー/

▲[ 88082 ] / 返信無し
■88107 / 4階層)  Re[4]: ツリービューのフォルダ表示名変更について
□投稿者/ ポッチャマ (4回)-(2018/08/02(Thu) 23:21:53)
No88082 (Hongliang さん) に返信

返信誠にありがとうございます。

public Form1()
{
InitializeComponent();
string[] Dir = Directory.GetDirectories(fPH ///他フォームのコンボボックスから選んだパス);
foreach (String GDir in Dir)
{
TreeNode node = new TreeNode(GDir);
node.Nodes.Add(new TreeNode());
treeView1.Nodes.Add(node);
}

}
この構文を
public Form1()
{
InitializeComponent();
DirectoryInfo Dir = new DirectoryInfo(fPH);
foreach (DirectoryInfo GDir in Dir.GetDirectories())
{
TreeNode node = new TreeNode(GDir.Name);
node.Nodes.Add(new TreeNode());
treeView1.Nodes.Add(node);
}

}


に変えたら

TreeNode node = new TreeNode("hoge") { Name = "name" };
treeView1.Nodes.Add(node);
treeView1.Nodes["name"].Text = "fuga";

を使わずにフォルダ名のみ(C:\Users\ユーザー名\が消えたもの)を表示することが出来ましたが、
子ノード(サブフォルダ)を展開することが出来なくなってしまいました。

fPH+"\"+フォルダ名 というようにすると子ノードを開けると思うのですが、、
そこで教えていただいた.TAGを使えばいいのかなとは思ったのですが、色々試してみても分かりませんでした><

TreeNode node = new TreeNode(fPH+"\"+GDir.Name);にすると意味ないですし・・・

子ノードを開けるようにするにはどうすれば良いですか?
申し訳ありませんがよろしくお願い致します。





[ 親 88078 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -