如何从treeview获取选定的节点及其子值? [英] How to get selected node and its child value from treeview?
本文介绍了如何从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屋!
查看全文