如何从treeview获取选定的节点及其子值? [英] How to get selected node and its child value from treeview?

查看:258
本文介绍了如何从treeview获取选定的节点及其子值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有复选框的逻辑驱动程序的树视图,现在我必须在datagridview中显示树视图选择的文件夹(如果它还有子文件夹和文件)。我试过但没有得到。



我尝试过:



I have a treeview with logical drivers with checkboxes, Now i have to display treeview selected folders(if it is having subfolders and files also) display in datagridview. I have tried but not getting.

What I have tried:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{            
            if (e.Node.Nodes.Count > 0)
            {
                if (e.Node.Nodes[0].Text == "..." && e.Node.Nodes[0].Tag == null)
                {
                    e.Node.Nodes.Clear();


                    string[] dirs = Directory.GetDirectories(e.Node.Tag.ToString());

                    foreach (string dir in dirs)
                    {
                        DirectoryInfo di = new DirectoryInfo(dir);
                        TreeNode node = new TreeNode(di.Name, 0, 1) { Checked = true };

                        try
                        {
                            node.Tag = dir;


                            //if (di.GetDirectories().Count() > 0)
                            node.Nodes.Add(null, "...", 0, 0).Checked = node.Checked;
                        }
                        catch (UnauthorizedAccessException)
                        {
                            node.ImageIndex = 12;
                            node.SelectedImageIndex = 12;
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "File Explorer", MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
                        }
                        finally
                        {
                            node.Checked = e.Node.Checked;
                            e.Node.Nodes.Add(node);
                        }
                    }
                }
            }                   
           
        }

        private void button3_Click(object sender, EventArgs e)
        {
            foreach (TreeNode originalNode in trwFileExplorer.Nodes)
            {
                 TreeNode newNode = new TreeNode(originalNode.FullPath);
                 newNode.Tag = originalNode.Tag;
                 treeView2.Nodes.Add(newNode);
                 IterateTreeNodes(originalNode, newNode);


            }
        }

        private void IterateTreeNodes(TreeNode originalNode, TreeNode rootNode)
        {
            foreach (TreeNode childNode in originalNode.Nodes)
            {
                TreeNode newNode = new TreeNode(childNode.FullPath);
                newNode.Tag = childNode.Tag;
                treeView2.SelectedNode = rootNode;
                treeView2.SelectedNode.Nodes.Add(newNode);
                IterateTreeNodes(childNode, newNode);
            }
        }





我没有把datagridview显示在这里。而不是datagridview我采取了treeview2。但我想在datagridview中显示其完整选定节点的完整路径。



I haven't taken datagridview to display here. instead of datagridview I took treeview2. but I want to display its full selected nodes full path in datagridview.

推荐答案

为什么不在标签中使用这样的前缀:

Why not a use a prefix in your tags like this:
e.Node.Tag = @"dir:c:\temp"



那么你可以很容易地识别它:


Then you could easily recognize it like this:

if (e.Node.Tag.ToString().StartsWith("dir:"))


使用树节点的BindingList示例。

您甚至可以使用:

Example for BindingList using Tree nodes.
You could even use:
public BindingList<TreeNode> bindingList;



但这不太实用:)


but that's not very practical :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace TestForm1
{
    /// <summary>
    /// Test data grid with BindingList.
    /// </summary>
    public partial class Form8 : Form
    {
        public BindingList<diskClass> bindingList;

        public Form8()
        {
            InitializeComponent();

            // Allow user to resize column widths.
            this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            this.dataGridView1.AllowUserToAddRows = false;
        }

        /// <summary>
        /// Fill the BindingList and set the dataGridView1.DataSource.
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            bindingList = new BindingList<diskClass>();
            bindingList.AllowNew = true;
            bindingList.AllowRemove = true;

            if (this.dataGridView1.DataSource != null)
            {
                this.dataGridView1.DataSource = null;
            }

            this.AddTestData(@"C:\Temp");
         }

        /// <summary>
        /// Add rows with directory names.
        /// </summary>
        private void AddTestData(string dirString)
        {
            string[] dirs = Directory.GetDirectories(dirString);
            int number = 1;

            foreach (string dir in dirs)
            {
                DirectoryInfo di = new DirectoryInfo(dir);
                TreeNode node = new TreeNode(dir, 0, 1) { Checked = true, Name = di.Name};

                var item = new diskClass();
                item.Number = number++;
                item.Name = node.Name;
                item.Path = node.Text;
                bindingList.Add(item);
            }

            this.dataGridView1.DataSource = bindingList;
            this.dataGridView1.Columns[0].Frozen = true;
        }

        private void buttonDelete_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentRow != null)
            {
                this.bindingList.RemoveAt(this.dataGridView1.CurrentRow.Index);
            }
        }

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            var item = new diskClass();
            bindingList.Add(item);
        }
    }

    public class diskClass
    {
        public int Number { get; set; }
        public string Name { get; set; }
        public string Path { get; set; }
    }
}


这篇关于如何从treeview获取选定的节点及其子值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆