2010-08-11 3 views
1

J'ai un projet C# utilisant la version 4.0 de l'infrastructure .net, et fonctionnant sur VS 2010. J'ai créé une vue arborescente peuplée de nœuds d'arbre étendus. Je souhaite que l'utilisateur puisse copier, couper et coller ces nœuds dans le Presse-papiers via un menu contextuel ou des raccourcis clavier (et pas seulement par glisser-déposer).Comment couper, copier et coller un nœud d'arbre étendu?

Le code s'exécute correctement lors de la copie, mais lorsque j'essaie de coller ces nœuds, il renvoie cette erreur: Impossible de convertir l'objet de type 'System.IO.MemoryStream' en type 'Namespace Path.TreeNodeEx'.

Voici mes méthodes de couper/copier/coller.

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


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

Je soupçonne que le problème est quelque chose à voir avec la sérialisation, mais j'ai essayé de mettre en œuvre l'interface ISeralizable et l'attribut [Serializable] en vain.

Des suggestions?

Répondre

1

Il se trouve que chaque nœud attaché à l'arbre étendu que j'avais un dictionnaire qui a stocké des informations supplémentaires. Apparemment, vous ne pouvez pas sérialiser les dictionnaires, ce qui empêchait la mise en série des noeuds d'arborescence.

J'ai implémenté ISerializable pour ces nœuds d'arborescence étendue, puis j'ai converti le dictionnaire en deux listes, que j'ai ensuite converties en dictionnaire dans le constructeur deserialize.

0

Essayez ceci:

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

J'ai essayé mais encore retourné nul. Je change également la méthode de copie en Clipboard.SetDataObject(), mais cela donne quand même un nœud nul. – User2400

0
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

vieux trucs, mais j'ai passé deux heures face au même problème, donc voici ce qui fonctionne:

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 
Questions connexes