c# - 将完整的 TreeView 设置为剪贴板

标签 c# winforms treeview

我正在使用 Windows 窗体,我想复制整个 TreeView 及其 subview ,以便在 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);

            }
        }

但它只是获取一个节点而不是所有节点。我应该怎么做?问候

更新:

为了得到节点和他们的 child ,我有

   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);
    }
}

关于c# - 将完整的 TreeView 设置为剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53399832/

相关文章:

c# - 从 Web App 调用时,System.Reflection.Assembly.GetEntryAssembly() 为空

c++ - 如何在 Windows 窗体/C++ 中将文本或数字旋转 90°?

c# - Visual Studio "Select Resource"对话框替换

c# - TreeNode 在 TreeView 未聚焦时选择了 BackColor

JQuery - 从数据动态生成图形 TreeView

c++ - 如何在我的 TreeView 中显示 +/- 图标?

c# - Spring.NET - 作为依赖项的 Lambdas - 可能使用 XML?

c# - 通过套接字发送和接收图像

c# - 在 .NET 中创建加密安全随机 GUID

c# - RichtextBox 加粗