- PR -

TreeViewコントロールの使い方

投稿者投稿内容
mina
会議室デビュー日: 2003/11/01
投稿数: 7
投稿日時: 2003-11-01 14:14
お世話になります。VB.NET初心者です。
今、WindowsApplicationで勉強を兼ねてちょっとしたツールを作っています。
やりたいことは、
フォルダを選択しそのフォルダ内のテキストファイルをTree表示する。
そしてTree内のファイルを選択すると、隣のTextBoxに内容を表示するというものです。
フォルダ内のファイル名をノードとして一覧にする所まではできましたが、
選択してファイルをオープンするところが解りません。

ご存知の方、いらっしゃったら教えていただけませんか?
(何分素人なものでうまく表現できなくてすみません。)
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-01 17:12
こんにちわ。諸農です。

ツリー表示できていると言うことは、選択されたノードからファイル名は取得できると思います。

右ペインに用意したTextBoxに読み込んだテキストデータの表示ですが、
StreamReaderクラスを使ってみては如何でしょうか。
SDK HELP
ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpconreadingtextfromfile.htm
文字コードなどの違いを意識する場合は、コンストラクタでEncodingの指定を行ってください。

また、テキストデータの表示にTextBoxではなく、RichRextBoxを使うと、LoadFileメソッドでそのままファイルを指定して読み込むことができます。

色々組み合わせて試してください。

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
mina
会議室デビュー日: 2003/11/01
投稿数: 7
投稿日時: 2003-11-01 20:57
諸農さん。ありがとうございます。

色々試してみました。
が、ツリーノードを選択してファイル名を取得する所がよく解らないのですが。。
も少しヒントを貰えないでしょうか?

後、TextBoxからRichTextBoxにしてみました。テキストボックスより簡単に
ファイルの読み込みが出来ました。以前は1行ずつ読み込んでループさせていましたが、
コーディングが1行で済みました。
Tohru
会議室デビュー日: 2002/12/19
投稿数: 19
投稿日時: 2003-11-01 23:39
一案としてツリーノードを追加する際に
ツリーノードのTagプロパティにファイルのパスを
入れておくのはどうでしょう?

表示内容によって可能なのであれば
ツリーノードのFullPathプロパティを使う方が
スマートな気はしますが
mina
会議室デビュー日: 2003/11/01
投稿数: 7
投稿日時: 2003-11-02 00:24
Tohruさんレスありがとうございます。
えっと、TagプロパティやFullPathプロパティがうまく使えないのですが。。。
フォームにボタンとツリービューがあり、ボタンを押すと
フォルダーブラウザダイアログが表示されフォルダを取得するというものです。
もしよければ何かご意見をお願いできますか?

'--------------------------------'
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim fbd As New FolderBrowserDialog
Dim drv As String
Dim strTemp() As String
Dim strTempMax As String
Dim Lavel1 As String
Dim nodeA As New TreeNode
fbd.Description = "フォルダを指定して下さい"
fbd.ShowNewFolderButton = False
fbd.RootFolder = Environment.SpecialFolder.Desktop
If fbd.ShowDialog(Me) = DialogResult.OK Then
drv = fbd.SelectedPath
TreeView1.Nodes.Clear()
nodeA = TreeView1.Nodes.Add(drv.ToString)
For Each Lavel1 In System.IO.Directory.GetFiles(drv)
strTemp = Split(Lavel1, "\")
strTempMax = UBound(strTemp)
nodeA.Nodes.Add(strTemp(strTempMax).ToString)
Next
End If

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-02 10:54
こんにちわ。諸農です。

引用:

minaさんの書き込み (2003-11-01 20:57) より:

が、ツリーノードを選択してファイル名を取得する所がよく解らないのですが。。
も少しヒントを貰えないでしょうか?



ツリービューにノードを追加する方法ですが、どのようにしていますか。
表示されているのは、例えば、次のような形になっているのでしょうか。
コード:
C:
  |
  +--Folder1
  |     |
  |     +--AAA.dat
  |     |
  |     +--BBB.dat
  |     |
  |     +--SubFolder
  |           |
  |           +--CCC.dat
  +--Folder2
        |
        +--ZZZ.dat


例えば、各ノードのラベル(Textプロパティ)をつなぎ合わせると、そのままファイル
パスになるのでしたら、TreeViewコントロールのPathSeparatorプロパティに「\」記号
をセットしておくことで、選択されているノードのFullPathプロパティを参照することで、
ファイルパスを取得することが出来ます。

各ノードのラベル(Textプロパティ)に使っている文字列を順に親ノードに向かって辿っ
て行っても、ファイルパスを作ることが出来ない--例えば、フォルダ名やファイル名は
ノードのTagプロパティなどに格納している--のであれば、自前の処理で、選択ノードから
順に親ノードをParentプロパティを使ってたどることになると思います。

前者のノードのテキストを組み合わせればファイルパスになる方法ですが、
次のような感じでOKだと思います。(C#ですので、読み替えてください)
コード:
private void GetDirFileList(string APath,TreeNode ANode)
{
    DirectoryInfo dirInfo = new DirectoryInfo(APath);
    DirectoryInfo[] dirs = dirInfo.GetDirectories();
    foreach (DirectoryInfo dir in dirs)
    {
        TreeNode temp = ANode.Nodes.Add(dir.Name);    
        GetDirFileList(dir.FullName,temp);
    }
    FileInfo[] files = dirInfo.GetFiles();
    foreach (FileInfo file in files)
    {
        ANode.Nodes.Add(file.Name);
    }
}

private void button1_Click(object sender, System.EventArgs e)
{
    treeView1.PathSeparator = @"\";
    if (Directory.Exists(textBox1.Text))
    {
        string root = textBox1.Text;
        treeView1.BeginUpdate();
        try
        {
            TreeNode temp = treeView1.Nodes.Add(root);
            GetDirFileList(root,temp);
            treeView1.ExpandAll();
        }
        finally
        {
            treeView1.EndUpdate();
        }
    }
}

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
    label1.Text = e.Node.FullPath;
}



ここでは、TextBoxで指定されたディレクトリ(フォルダ)が存在していれば、
そのフォルダをルートノードにしてツリービューを作成します。
作成したツリービューのノードを選択されたら、そのノードのFullPathプロパティを
ラベルに表示します。


ではでは(^^)/


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-02 12:05
こんにちわ。諸農です。

補足です。
引用:

コード:
    foreach (DirectoryInfo dir in dirs)
    {
        TreeNode temp = ANode.Nodes.Add(dir.Name);    
        GetDirFileList(dir.FullName,temp);
    }




ここで、システム属性のものがヒットした場合は、
再帰処理に持っていかないようにしないといけませんね(^_^;

それと、
引用:

コード:
            TreeNode temp = treeView1.Nodes.Add(root);
            GetDirFileList(root,temp);




検索ルートが「C:\」の場合は、ルートノードのラベルには
「\」記号を除いたものを指定する必要ありですね。


時間が無いので、訂正コードは無しです(^^;
すみませんm(__)m


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Tohru
会議室デビュー日: 2002/12/19
投稿数: 19
投稿日時: 2003-11-06 10:13
TagプロパティFullPathプロパティを試している部分が
掲載ソースには無い様ですが・・・


FullPathプロパティの方はJubeiさんが説明くださっているので
私はTagプロパティの方を

掲載ソースの宣言部に Dim nodeB As New TreeNode を追加し
nodeA.Nodes.Add(strTemp(strTempMax).ToString) の部分を
nodeB = nodeA.Nodes.Add(strTemp(strTempMax).ToString)
nodeB.Tag = Lavel1
とすることで各ノードにファイルパスの情報を持たせることが出来ると思います

取り出し時には
対象ノード.Tag.ToString()
でファイルパスを取り出せます

実行確認はとっていないので、もし間違いがあればごめんなさい


掲載ソースの様な形であれば、
私ならおそらくdrvの内容をstring変数に保存させておいて
選択時にFullPathプロパティの内容と結合して使うと思います

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