C# 将完整树视图设置为剪贴板
我正在使用windows窗体,我想复制整个树视图及其子视图,并在C# 将完整树视图设置为剪贴板,c#,winforms,treeview,C#,Winforms,Treeview,我正在使用windows窗体,我想复制整个树视图及其子视图,并在KeyDown事件中按剪贴板中设置的顺序进行复制 首先,我尝试将父节点设置为: private void tvProjectList_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.C)) { var treeViewParents = "";
KeyDown
事件中按剪贴板中设置的顺序进行复制
首先,我尝试将父节点设置为:
private void tvProjectList_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.C))
{
var treeViewParents = "";
foreach (TreeNode tn in tvProjectList.Nodes)
{
treeViewParents += tn.Text + Environment.NewLine;
}
Clipboard.SetText(treeViewParents);
}
}
但它只得到一个节点,而不是所有节点。我该怎么做?问候
更新:
为了得到节点和它们的子节点,我有
private void tvProjectList_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.C))
{
foreach (TreeNode node in tvProjectList.Nodes)
{
PrintNodesRecursive(node);
}
}
}
public void PrintNodesRecursive(TreeNode oParentNode)
{
Console.WriteLine(oParentNode.Text);
var treeViewParents = "";
StringBuilder sb = new StringBuilder();
// Start recursion on all subnodes.
foreach (TreeNode oSubNode in oParentNode.Nodes)
{
sb.Append(oSubNode.Text + Environment.NewLine);
PrintNodesRecursive(oSubNode);
}
Clipboard.SetText(sb.ToString());
}
但是字符串生成器总是带有空字符串。。。为什么数据不保存在字符串生成器中?关于扩展我的评论,下面是一个实现递归方法的示例:
private void CopyTreeViewToClipboard(TreeView treeView)
{
// Make a StringBuilder to store the text of each individual node
var treeViewStringBuilder = new StringBuilder();
// Initiate the recursive method
GetTreeViewNodesText(treeView.Nodes, treeViewStringBuilder);
// because StringBuilder is a reference type we do not need use a return value
// and we can copy to clipboard using the already existing reference
Clipboard.SetText(treeViewStringBuilder.ToString());
}
private void GetTreeViewNodesText(TreeNodeCollection nodesInCurrentLevel, StringBuilder sb, int level = 0)
{
foreach (TreeNode currentNode in nodesInCurrentLevel)
{
// Add some padding (spaces) in front to display the current level
sb.Append(new string(' ', level * 2));
// Add the text and terminate the line \n\r
sb.AppendLine(currentNode.Text);
// Recursion happens here, it's level + 1 instead of level++ because we
// do not want to alter the level for the next nodes in nodesInCurrentLevel
GetTreeViewNodesText(currentNode.Nodes, sb, level + 1);
}
}
试着写一封信。然后您可以写入这些节点,并使用
StringBuilder
对其进行压缩。您正在PrintNodesRecursive
递归方法中创建一个新的StringBuilder
,这将为树视图中的每个节点创建一个,并最终将该级别的文本复制到剪贴板。方法完成后,剪贴板上将只显示最后一个TreeNode的第一级。相反,您应该在调用递归方法之前创建一个递归方法,并在每次调用中使用该方法。