سؤال

لدي مشروع 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top