复制TreeView节点

4

我正在尝试将选定的树形节点复制到剪贴板,以便在记事本中粘贴。这是我的代码,但它不起作用。

    TreeNode selNode = (TreeNode)this.treeView1.SelectedNode;
    Clipboard.SetData("TreeNode", selNode);
3个回答

19

记事本无法识别Winforms TreeNode类。请改用Clipboard.SetText():

    private void treeView1_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyData == (Keys.Control | Keys.C)) {
            if (treeView1.SelectedNode != null) {
                Clipboard.SetText(treeView1.SelectedNode.Text);
            }
            e.SuppressKeyPress = true;
        }
    }

3
XAML:
<TreeView>
  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <EventSetter Event="Loaded" Handler="ItemLoaded"/>
    </Style >
  </TreeView.ItemContainerStyle>
</TreeView>

C#:

protected void ItemLoaded(object sender, EventArgs e)
{
  if (sender is TreeViewItem)
  {
    TreeViewItem item = sender as TreeViewItem;

    if (item.CommandBindings.Count == 0)
    {
      CommandBinding copyCmdBinding = new CommandBinding();
      copyCmdBinding.Command = ApplicationCommands.Copy;
      copyCmdBinding.Executed += CopyCmdBinding_Executed;
      copyCmdBinding.CanExecute += CopyCmdBinding_CanExecute;
      item.CommandBindings.Add(copyCmdBinding);
    }
}

private void CopyCmdBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
  if (sender is TreeViewItem)
    if ((sender as TreeViewItem).Header is MyClass)
      Clipboard.SetText(((sender as TreeViewItem).Header as MyClass).MyValue);
}

private void CopyCmdBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = false;
  if (sender is TreeViewItem)
    if ((sender as TreeViewItem).Header is MyClass)
      e.CanExecute = true;
}

我喜欢这个...它对我来说工作得非常好。非常感谢你。 - Kieran Ojakangas

0
如果您希望其他程序能够识别剪贴板中的内容,您需要使用已识别的数据格式(例如纯文本或位图)字符串参数,并将树节点格式化为该格式(例如,如果您选择文本,则应将“string”作为剪贴板数据传递,可能是TreeNode.Text值)。请参阅System.Windows.Forms.DataFormats以获取不同的预定义类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接