Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 如何剪切、复制和粘贴扩展树节点?_Visual Studio 2010_Treeview_C# 4.0_Copy Paste_Treenode - Fatal编程技术网

Visual studio 2010 如何剪切、复制和粘贴扩展树节点?

Visual studio 2010 如何剪切、复制和粘贴扩展树节点?,visual-studio-2010,treeview,c#-4.0,copy-paste,treenode,Visual Studio 2010,Treeview,C# 4.0,Copy Paste,Treenode,我有一个c#项目,使用.net framework的4.0版,运行在VS2010上。我创建了一个树视图,其中填充了一些扩展的树节点。我希望用户能够通过上下文菜单或键盘快捷键(而不仅仅是拖放)将这些节点复制、剪切和粘贴到剪贴板 复制时代码运行良好,但当我尝试粘贴这些节点时,会引发以下错误: 无法将“System.IO.MemoryStream”类型的对象强制转换为“Namespace Path.treenodex”类型 这是我的剪切/复制/粘贴方法 public void Copy() {

我有一个c#项目,使用.net framework的4.0版,运行在VS2010上。我创建了一个树视图,其中填充了一些扩展的树节点。我希望用户能够通过上下文菜单或键盘快捷键(而不仅仅是拖放)将这些节点复制、剪切和粘贴到剪贴板

复制时代码运行良好,但当我尝试粘贴这些节点时,会引发以下错误: 无法将“System.IO.MemoryStream”类型的对象强制转换为“Namespace Path.treenodex”类型

这是我的剪切/复制/粘贴方法

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


public void Paste()
{
    CurrentTreeNode.Nodes.Add((TreeNodeEx)Clipboard.GetData("Tree Node Ex"));
}
我怀疑问题与序列化有关,但我尝试实现ISerializable接口和[Serializable]属性,但没有任何效果

有什么建议吗?

试试这个:

Clipboard.GetDataObject().GetData(typeof(TreeNodeEx))
试试这个:

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

事实证明,在每个扩展树节点上,我都有一个存储额外信息的字典。显然,您无法序列化字典,因此这会阻止任何树节点被序列化


我为这些扩展树节点实现了
ISerializable
,然后将字典转换为两个列表,然后将其转换回反序列化构造函数中的字典。

事实证明,每个扩展树节点都有一个存储额外信息的字典。显然,您无法序列化字典,因此这会阻止任何树节点被序列化

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();
}
我为这些扩展树节点实现了
ISerializable
,然后将字典转换为两个列表,然后在反序列化构造函数中将其转换回字典。

public void copy()
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();
}
{ tempNode=TreeView.SelectedNode; } 公共空白粘贴() { TreeView.SelectedNode.Nodes.Add(新树节点(tempNode.Text)); tNode=TreeView.SelectedNode.LastNode; 对于(int i=0;i
public void copy()
{
tempNode=TreeView.SelectedNode;
}
公共空白粘贴()
{
TreeView.SelectedNode.Nodes.Add(新树节点(tempNode.Text));
tNode=TreeView.SelectedNode.LastNode;

对于(inti=0;i旧东西,但我花了几个小时面对同样的问题,所以下面是有效的方法:

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
导入System.Runtime.Serialization
公开课表格1
私有子表单1_Load(发送方作为对象,e作为事件参数)处理Me.Load
Me.TV.Nodes.Clear()
将tNode设置为新的TemplateNode()
Me.TV.Nodes.Add(tNode)
对于i,作为整数=1到5
将newNode调整为新的TemplateNode()
tNode.Nodes.Add(newNode)
tNode=newNode
下一个
Me.TV.ExpandAll()
端接头
私有子TV_ItemDrag(发送方作为对象,e作为ItemDragEventArgs)处理TV.ItemDrag
DoDragDrop(Me.TV.SelectedNode,DragDropEffects.Copy+DragDropEffects.Move+DragDropEffects.Scroll)
端接头
专用子TV_DragEnter(发送方作为对象,e作为DragEventArgs)处理TV.DragEnter
e、 效果=DragDropEffects.Move
端接头
专用子TV_DragOver(发送方作为对象,e作为DragEventArgs)处理TV.DragOver
e、 效果=DragDropEffects.Move
如果(e.KeyState和8)=8,则
e、 效果+=DragDropEffects.Copy
如果结束
端接头
私有子TV_DragDrop(发送方作为对象,e作为DragEventArgs)处理TV.DragDrop
Dim TemplateNode As TemplateNode=e.Data.GetData(GetType(TemplateNode))
Me.TV.Nodes.Add(TemplateNode.Clone())
端接头
私有子b复制\u单击(发送者作为对象,e作为事件参数)处理b复制。单击
My.Computer.Clipboard.SetData(“TemplateNode”,Me.TV.SelectedNode)
端接头
Private Sub bCut\u Click(发件人作为对象,e作为事件参数)处理bCut。单击
My.Computer.Clipboard.SetData(“TemplateNode”,Me.TV.SelectedNode)
Me.TV.SelectedNode.Remove()
端接头
私有子bPaste\u单击(发件人作为对象,e作为事件参数)处理bPaste。单击
Dim TemplateNode As TemplateNode=My.Computer.Clipboard.GetData(“TemplateNode”)
如果Me.TV.SelectedNode为空,则
Me.TV.Nodes.Add(TemplateNode)
其他的
Me.TV.SelectedNode.Nodes.Add(TemplateNode)
如果结束
端接头
末级
_
公共类模板节点
继承TreeNode
Public MyString As String=“MyStringValue”
Public MyDateTime As DateTime=DateTime.Now
公共MyBytes()作为字节
公共分新()
Dim buff(255)作为字节
对于i As Integer=0到buff.GetUpperBound(0)
buff(i)=CByte(Rnd()*100)
下一个
Me.MyBytes=buff
Me.Text=Guid.NewGuid().ToString()
端接头
受保护的好友子新建(信息作为SerializationInfo,上下文作为StreamingContext)
MyBase.New(信息、上下文)
端接头
末级

旧东西,但我花了几个小时面对同样的问题,所以下面是有效的方法:

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
导入System.Runtime.Serialization
公开课表格1
私有子表单1_Load(发送方作为对象,e作为事件参数)处理Me.Load
Me.TV.Nodes.Clear()
将tNode设置为新的TemplateNode()
Me.TV.Nodes.Add(tNode)
对于i,作为整数=1到5
将newNode调整为新的TemplateNode()
tNode.Nodes.Add(newNode)
tNode=newNode
下一个
Me.TV.ExpandAll()
端接头
私有子TV_ItemDrag(发送方作为对象,e作为ItemDragEventArgs)处理TV.ItemDrag
DoDragDrop(Me.TV.SelectedNode,DragDropEffects.Copy+DragDropEffects.Move+DragDropEffects.Scroll)
端接头
专用子TV_DragEnter(发送方作为对象,e作为DragEventArgs)处理TV.DragEnter
e、 效果=DragDropEffects.Move
端接头
专用子TV_DragOver(发送方作为对象,e作为DragEventArgs)处理TV.DragOver
e、 效果=DragDropEffects.Move
如果(e.KeyState和8)=8,则
e、 效果+=DragDropEffects.Copy
如果结束
端接头
私有子TV_DragDrop(发送方作为对象,e作为DragEventArgs)处理TV.DragDrop
Dim TemplateNode As TemplateNode=e.Data.GetData(GetType(TemplateNode))
Me.TV.Nodes.Add(TemplateNode.Clone())
端接头
私有子b复制\u单击(发送者作为对象,e作为事件参数)处理b复制。单击
My.Computer.Clipboard.SetData(“TemplateNode”,Me.TV.SelectedNode)
端接头
私有子bCut_单击(发件人作为对象,e作为事件参数)Han