كيف يمكنك قطع ونسخ ولصق عقدة شجرة ممتدة؟
-
27-09-2019 - |
سؤال
لدي مشروع AC# باستخدام الإصدار 4.0 من .NET Framework ، وتشغيله على VS 2010. لقد أنشأت عرض شجرة ملوثًا ببعض العقد الشجرة الممتدة. أريد أن يكون المستخدم قادرًا على نسخ هذه العقد وقطعها ولصقها إلى الحافظة عبر قائمة سياق أو اختصارات لوحة المفاتيح (وليس فقط drop-drop).
يعمل الرمز بشكل جيد عند النسخ ، ولكن عندما أحاول لصق هذه العقد ، فإنه يلقي هذا الخطأ: غير قادر على إلقاء كائن من النوع "system.io.momorystream" لكتابة "مساحة المساحة".
ها هي أساليب القطع/النسخ/لصق.
public void Copy()
{
Clipboard.SetData("Tree Node Ex", CurrentTreeNode.Clone());
}
public void Paste()
{
CurrentTreeNode.Nodes.Add((TreeNodeEx)Clipboard.GetData("Tree Node Ex"));
}
أظن أن المشكلة علاقة بالتسلسل ، لكنني حاولت تنفيذ واجهة iseralizable و [Serializable] السمة دون جدوى.
أي اقتراحات؟
المحلول
اتضح أن ذلك متصل بكل عقدة شجرة ممتدة كان لدي قاموس يخزن معلومات إضافية. من الواضح أنه لا يمكنك إجراء تسلسل القواميس ، لذلك كان هذا يمنع أي من العقد الشجرة من التسلسل.
لقد نفذت ISerializable
بالنسبة لهذه العقد الشجرية الممتدة ، ثم حولت القاموس إلى قائمتين ، ثم قمت بتحويله مرة أخرى إلى قاموس في مُنشئ التخلص.
نصائح أخرى
جرب هذا:
Clipboard.GetDataObject().GetData(typeof(TreeNodeEx))
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();
}
الأشياء القديمة ولكني قضيت بضع ساعات في مواجهة نفس المشكلة ، فإليك ما ينجح:
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