2

私はこのコードを持っています:

    public void AddNode(string Node)
    {
        try
        {
            treeView.Nodes.Add(Node);
            treeView.Refresh();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

ご覧のとおり、このメソッドはファイルパスを取得します。お気に入りC:\Windows\notepad.exe

次に、TreeViewにFileSystemのように表示させます。

-C:\
    +Windows

そして、「+」をクリックすると、次のようになります。

-C:\
    -Windows
       notepad.exe

これらのパスを上記のメソッドに送信することで得られるものは次のとおりです。

TreeViewの現在の外観

ノードを配置する方法を教えてください。

4

4 に答える 4

1

私があなたなら、string.Splitメソッドを使用して入力文字列を部分文字列に分割し、適切なノードを検索してノードの関連部分を挿入します。つまり、ノードを追加する前に、ノード C:\ とその子ノード (Windows) が存在するかどうかを確認する必要があります。

これが私のコードです:

...
            AddString(@"C:\Windows\Notepad.exe");
            AddString(@"C:\Windows\TestFolder\test.exe");
            AddString(@"C:\Program Files");
            AddString(@"C:\Program Files\Microsoft");
            AddString(@"C:\test.exe");
...

        private void AddString(string name) {
            string[] names = name.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
            TreeNode node = null;
            for(int i = 0; i < names.Length; i++) {
                TreeNodeCollection nodes = node == null? treeView1.Nodes: node.Nodes;
                node = FindNode(nodes, names[i]);
                if(node == null)
                    node = nodes.Add(names[i]);
            }
        }

        private TreeNode FindNode(TreeNodeCollection nodes, string p) {
            for(int i = 0; i < nodes.Count; i++)
                if(nodes[i].Text.ToLower(CultureInfo.CurrentCulture) == p.ToLower(CultureInfo.CurrentCulture))
                    return nodes[i];
            return null;
        }
于 2011-07-06T18:48:29.023 に答える
0

親と子が区別されていないことが問題ですか?

ツリー内の各ノードには、その子のコレクションを表す Nodes プロパティもあります。AddNode ルーチンを変更して、子ノードを追加する親ノードを指定できるようにする必要があります。お気に入り:

TreeNode parent = //some node
parent.Nodes.Add(newChildNode);

パスを入力して親子関係自体を把握したい場合は、パスを解析し、パス セグメントに基づいて親ノードを識別するコードを記述する必要があります。

于 2011-07-06T18:40:41.100 に答える
0

Windows フォームを使用している場合(私はそうだと思います)、IComparerクラスを実装してTreeView.TreeViewNodeSorterプロパティを使用できます。

public class NodeSorter : IComparer
{
    // Compare the length of the strings, or the strings
    // themselves, if they are the same length.
    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        // Compare the length of the strings, returning the difference.
        if (tx.Text.Length != ty.Text.Length)
            return tx.Text.Length - ty.Text.Length;

        // If they are the same length, call Compare.
        return string.Compare(tx.Text, ty.Text);
    }
}
于 2011-07-06T18:39:04.013 に答える
0

このFilesystem TreeViewを見てみてください。それはまさにあなたが探していることをするはずです。

于 2011-07-06T18:49:42.647 に答える