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

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

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

Re[2]: C#のエクスプローラー表示


(過去ログ 132 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■78073 / inTopicNo.1)  C#のエクスプローラー表示
  
□投稿者/ 大豆 (1回)-(2015/12/11(Fri) 16:05:58)

分類:[C#] 

VisualStdio2010 windowsアプリケーション

C#にて任意のフォルダをTreeViewへとドラッグ&ドロップし、その中にあるサブディレクトリやファイルを全てTreeView上で表示させる動作が目的なのですが
サブディレクトリへはどのようにaddしていけばいいでしょうか

        private void FileDraw_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.All;
            }
        }
        private void FileDraw_DragDrop(object sender, DragEventArgs e)
        {
            treeview1.Nodes.Clear();
            string[] filename = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            if (filename.Length <= 0)
            {
                return;
            }
            TreeView tb = sender as TreeView;
            if (tb == null)
            {
                return;
            }
            root_ob = filename;
            string root_name = System.IO.Path.GetFileName(root_ob[0]);
            rootNode = new TreeNode(root_name);
            treeview1.Nodes.Add(rootNode);
            Search(root_ob[0]);

        }

        private void Search(string startdir)
        {
            TreeNode child;
            TreeNode gchild;
            TreeNode cont;
            TreeNode t=new TreeNode();

            child = new TreeNode();
            gchild = new TreeNode();
            cont = new TreeNode();

            t = rootNode;
            foreach(string file in System.IO.Directory.GetFiles(startdir))
            {
                string fn = file;
                string fn_add = System.IO.Path.GetFileName(fn);
                gchild = new TreeNode(fn_add);
                rootNode.Nodes.Add(gchild);

            }
            foreach (string dir in System.IO.Directory.GetDirectories(startdir))
            {
                string dn = dir;
                string dn_add = System.IO.Path.GetFileName(dn);
                child = new TreeNode(dn_add);
                rootNode.Nodes.Add(child);
                rootNode = child;
                Search(dir);
            }  
        }

引用返信 編集キー/
■78074 / inTopicNo.2)  Re[1]: C#のエクスプローラー表示
□投稿者/ 魔界の仮面弁士 (600回)-(2015/12/11(Fri) 16:42:44)
No78073 (大豆 さん) に返信
> C#にて任意のフォルダをTreeViewへとドラッグ&ドロップし、その中にあるサブディレクトリやファイルを全てTreeView上で表示させる動作が目的なのですが

個人的には、全階層の登録はお奨めしません。

フォルダ数が多い場所(Program Files フォルダや Windows フォルダなど)だと
登録完了までに長い時間がかかってしまいますし、

ChDir /D C:\
MkDir C:\TestDir
MkDir C:\TestDir\SubDir
MkLink /D C:TestDir\SubDir\Link C:\TestDir

などのように、再帰階層のフォルダ構造があった際には
無限ループに陥ってしまうからです。


そこで自分の場合は、まずは「畳んだ状態」のフォルダを追加するようにし、
ユーザーがそのフォルダノードを展開したとき(BeforeExpand イベント)に、
改めてその直下の階層のみを追加するという実装にしています。
引用返信 編集キー/
■78075 / inTopicNo.3)  Re[2]: C#のエクスプローラー表示
□投稿者/ 魔界の仮面弁士 (601回)-(2015/12/11(Fri) 17:03:41)
No78074 (魔界の仮面弁士) に追加
> そこで自分の場合は、まずは「畳んだ状態」のフォルダを追加するようにし、
> ユーザーがそのフォルダノードを展開したとき(BeforeExpand イベント)に、
> 改めてその直下の階層のみを追加するという実装にしています。

動的追加のサンプル。


using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
   treeView1.PathSeparator = "\\";
   
   var root = treeView1.Nodes.Add(@"C:\Program Files");
   SetTree(root, new DirectoryInfo(@"C:\Program Files"));

   treeView1.BeforeExpand += delegate(object sender, TreeViewCancelEventArgs e)
   {
    if (e.Node.FirstNode.Text == "NUL")
    {
     e.Node.FirstNode.Remove();
     SetTree(e.Node, new DirectoryInfo(e.Node.FullPath));
    }
   };
  }

  private void SetTree(TreeNode parent, DirectoryInfo di)
  {
   foreach (var dir in di.GetDirectories())
   {
    var subDir = parent.Nodes.Add(dir.Name);
    if (dir.EnumerateFileSystemInfos().Any())
    {
     subDir.Nodes.Add("NUL").Collapse();
     subDir.Collapse();
    }
   }
   foreach (var file in di.GetFiles())
   {
    parent.Nodes.Add(file.Name);
   }
  }
 }
}
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -