C#:从剪贴板中检索数据时,始终为空

C#:从剪贴板中检索数据时,始终为空,c#,clipboard,C#,Clipboard,我已经在剪贴板中存储了我的类的实例,当从剪贴板中检索到相同的实例时,总是会得到null。我标记了我的类[Serializable],但仍然没有运气。我无法找出我在哪里犯的错误。这是我的密码。请看一看,并告诉我我在哪里犯了错误,以及在代码中更改了什么,因此我应该能够检索我存储在剪贴板中的对象。谢谢 //Save object to clipboard private void BtnSet_Click(object sender, EventArgs e) { NodeCollection

我已经在剪贴板中存储了我的类的实例,当从剪贴板中检索到相同的实例时,总是会得到null。我标记了我的类
[Serializable]
,但仍然没有运气。我无法找出我在哪里犯的错误。这是我的密码。请看一看,并告诉我我在哪里犯了错误,以及在代码中更改了什么,因此我应该能够检索我存储在剪贴板中的对象。谢谢

//Save object to clipboard
private void BtnSet_Click(object sender, EventArgs e)
{
    NodeCollection ndCollection = new NodeCollection();
    TunerDetails tds = null;
    selectednode = tvCsmTuner.SelectedNode;
    if (selectednode == null) return;

    if (selectednode != null)
    {
        ndCollection.Name = selectednode.Text;
        ndCollection.Text = selectednode.Text;
        ndCollection.Tag = selectednode.Tag;

        foreach (TreeNode node in selectednode.Nodes)
        {
            ndCollection.Nodes.Add(new NodeCollection { Name = node.Text, Text = node.Text, Tag = node.Tag });
        }

        DataObject data = new DataObject();
        data.SetData(ndCollection);
        Clipboard.SetDataObject(data);

    }

    RemoveNode();

}


//Read object back from clipboard
private void BtnGet_Click(object sender, EventArgs e)
{
        DataObject retrievedData = (DataObject)Clipboard.GetDataObject();
        if (retrievedData.GetDataPresent(typeof(NodeCollection)))
        {
            NodeCollection ndCollection1 = retrievedData.GetData(typeof(NodeCollection)) as NodeCollection;
            if (ndCollection1 != null)
            {
                MessageBox.Show(ndCollection1.Name);
            }
        }
}


[Serializable]
public class NodeCollection 
{
    public NodeCollection() {
        Nodes = new List<NodeCollection>();
    }
    
    #region PROPERTIES
    public string Name { get; set; }
    public string Text { get; set; }
    public object Tag { get; set; }
    public List<NodeCollection> Nodes { get; set; }
    #endregion
}
//将对象保存到剪贴板
私有void BtnSet\u单击(对象发送方,事件参数e)
{
NodeCollection ndCollection=新的NodeCollection();
TunerDetails tds=null;
selectednode=tvCsmTuner.selectednode;
if(selectednode==null)返回;
如果(selectednode!=null)
{
ndCollection.Name=selectednode.Text;
ndCollection.Text=selectednode.Text;
ndCollection.Tag=selectednode.Tag;
foreach(selectednode.Nodes中的TreeNode节点)
{
添加(新节点集合{Name=node.Text,Text=node.Text,Tag=node.Tag});
}
数据对象数据=新的数据对象();
data.SetData(ndCollection);
剪贴板.SetDataObject(数据);
}
RemoveNode();
}
//从剪贴板读回对象
私有void BtnGet\u单击(对象发送方,事件参数e)
{
DataObject retrievedData=(DataObject)剪贴板。GetDataObject();
if(retrievedData.GetDataPresent(typeof(NodeCollection)))
{
NodeCollection ndCollection1=retrievedData.GetData(typeof(NodeCollection))作为NodeCollection;
如果(ndCollection1!=null)
{
MessageBox.Show(ndCollection1.Name);
}
}
}
[可序列化]
公共类节点集合
{
公共节点集合(){
节点=新列表();
}
#区域属性
公共字符串名称{get;set;}
公共字符串文本{get;set;}
公共对象标记{get;set;}
公共列表节点{get;set;}
#端区
}
在同一个应用程序中,当我尝试以这种方式在剪贴板中创建同一对象时,它就起作用了。下面的代码有效。所以现在我更困惑的是,客户数据在剪贴板中得到存储和检索,而我的nodecollection类并没有从剪贴板中得到检索

DataObject mydata = new DataObject();
Customer c = new Customer("Customer as Customer object");
c.Nodes.Add(new Customer { Name = "Hello" });
mydata.SetData(c);
Clipboard.SetDataObject(mydata);

DataObject MyretrievedData = (DataObject)Clipboard.GetDataObject();
if (MyretrievedData.GetDataPresent(typeof(Customer)))
{
    Customer customer =
        MyretrievedData.GetData(typeof(Customer)) as Customer;
    if (customer != null)
    {
        MessageBox.Show(customer.Name);
    }
}

[Serializable]
public class Customer
{
    public Customer() { }
    private string nameValue = string.Empty;
    public Customer(String name)
    {
        nameValue = name;
        Nodes = new List<Customer>();
    }
    public string Name
    {
        get { return nameValue; }
        set { nameValue = value; }
    }

    public List<Customer> Nodes { get; set; }
}
dataobjectmydata=newdataobject();
客户c=新客户(“作为客户对象的客户”);
c、 添加(新客户{Name=“Hello”});
mydata.SetData(c);
剪贴板.SetDataObject(mydata);
DataObject MyretrievedData=(DataObject)剪贴板。GetDataObject();
if(MyretrievedData.GetDataPresent(typeof(Customer)))
{
顾客顾客=
MyretrievedData.GetData(typeof(Customer))作为客户;
如果(客户!=null)
{
MessageBox.Show(customer.Name);
}
}
[可序列化]
公共类客户
{
公共客户(){}
私有字符串nameValue=string.Empty;
公共客户(字符串名称)
{
名称值=名称;
节点=新列表();
}
公共字符串名
{
获取{return nameValue;}
设置{nameValue=value;}
}
公共列表节点{get;set;}
}

可能是因为这个
RemoveNode(),它会从集合中删除节点。评论并尝试。是的,我评论了,但仍然没有luckI看到。确保分配给
selectednode.Tag
属性的内容也是可序列化的对象。另外,如果(selectednode!=null)
,则不需要此
,因为前一行已经进行了检查。