Как вырезать, копировать и вставлять расширенный узел дерева? - PullRequest
1 голос
/ 11 августа 2010

У меня есть проект ac #, использующий версию 4.0 .net framework и работающий на VS 2010. Я создал древовидное представление, заполненное некоторыми расширенными узлами дерева.Я хочу, чтобы пользователь мог копировать, вырезать и вставлять эти узлы в буфер обмена с помощью контекстного меню или сочетаний клавиш (а не просто перетаскивания).

Код работает нормально при копировании, но когдаЯ пытаюсь вставить эти узлы, он выдает эту ошибку: Невозможно привести объект типа 'System.IO.MemoryStream' к типу 'Namespace Path.TreeNodeEx'.

Вот мои методы вырезания / копирования / вставки.

public void Copy()
{
    Clipboard.SetData("Tree Node Ex", CurrentTreeNode.Clone());
}


public void Paste()
{
    CurrentTreeNode.Nodes.Add((TreeNodeEx)Clipboard.GetData("Tree Node Ex"));
}

Я подозреваю, что проблема связана с сериализацией, но я попытался реализовать интерфейс ISeralizable и атрибут [Serializable] безрезультатно.

Есть предложения?

Ответы [ 4 ]

1 голос
/ 14 августа 2010

Получается, что к каждому расширенному узлу дерева был привязан словарь, в котором хранилась дополнительная информация. По-видимому, вы не можете сериализовать словари, поэтому это препятствовало сериализации любого из узлов дерева.

Я реализовал ISerializable для этих расширенных узлов дерева, а затем преобразовал словарь в два списка, которые затем преобразовал обратно в словарь в конструкторе десериализации.

0 голосов
/ 20 апреля 2015

Старые вещи, но я провел пару часов, столкнувшись с той же проблемой, так что вот что работает:

Imports System.Runtime.Serialization

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.TV.Nodes.Clear()
    Dim tNode As New TemplateNode()
    Me.TV.Nodes.Add(tNode)
    For i As Integer = 1 To 5
        Dim newNode As New TemplateNode()
        tNode.Nodes.Add(newNode)
        tNode = newNode
    Next
    Me.TV.ExpandAll()
End Sub


Private Sub TV_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles TV.ItemDrag
    DoDragDrop(Me.TV.SelectedNode, DragDropEffects.Copy + DragDropEffects.Move + DragDropEffects.Scroll)
End Sub
Private Sub TV_DragEnter(sender As Object, e As DragEventArgs) Handles TV.DragEnter
    e.Effect = DragDropEffects.Move
End Sub
Private Sub TV_DragOver(sender As Object, e As DragEventArgs) Handles TV.DragOver
    e.Effect = DragDropEffects.Move
    If (e.KeyState And 8) = 8 Then
        e.Effect += DragDropEffects.Copy
    End If
End Sub
Private Sub TV_DragDrop(sender As Object, e As DragEventArgs) Handles TV.DragDrop
    Dim TemplateNode As TemplateNode = e.Data.GetData(GetType(TemplateNode))
    Me.TV.Nodes.Add(TemplateNode.Clone())
End Sub


Private Sub bCopy_Click(sender As Object, e As EventArgs) Handles bCopy.Click
    My.Computer.Clipboard.SetData("TemplateNode", Me.TV.SelectedNode)
End Sub
Private Sub bCut_Click(sender As Object, e As EventArgs) Handles bCut.Click
    My.Computer.Clipboard.SetData("TemplateNode", Me.TV.SelectedNode)
    Me.TV.SelectedNode.Remove()
End Sub
Private Sub bPaste_Click(sender As Object, e As EventArgs) Handles bPaste.Click
    Dim TemplateNode As TemplateNode = My.Computer.Clipboard.GetData("TemplateNode")
    If Me.TV.SelectedNode Is Nothing Then
        Me.TV.Nodes.Add(TemplateNode)
    Else
        Me.TV.SelectedNode.Nodes.Add(TemplateNode)
    End If
End Sub

End Class


<Serializable()> _
Public Class TemplateNode
    Inherits TreeNode

Public MyString As String = "MyStringValue"
Public MyDateTime As DateTime = DateTime.Now
Public MyBytes() As Byte

Public Sub New()
    Dim buff(255) As Byte
    For i As Integer = 0 To buff.GetUpperBound(0)
        buff(i) = CByte(Rnd() * 100)
    Next
    Me.MyBytes = buff
    Me.Text = Guid.NewGuid().ToString()
End Sub
Protected Friend Sub New(info As SerializationInfo, context As StreamingContext)
    MyBase.New(info, context)
End Sub

End Class
0 голосов
/ 06 апреля 2015
public void copy()
{
tempNode = TreeView.SelectedNode;
}
public void paste()
{
TreeView.SelectedNode.Nodes.Add(new TreeNode(tempNode.Text));
            tNode = TreeView.SelectedNode.LastNode;
            for (int i = 0; i <= tempNode.Nodes.Count - 1; i++)
            {
                TreeNode NodeClone = (TreeNode)tempNode.Nodes[i].Clone();
                tNode.Nodes.Add(NodeClone);
            }
public void cut()
{
tempNode = TreeView.SelectedNode;
            TreeView.SelectedNode.Remove();
}
0 голосов
/ 11 августа 2010

Попробуйте это:

Clipboard.GetDataObject().GetData(typeof(TreeNodeEx))
...