c#Paste List <myobj>返回null

时间:2017-08-04 21:10:43

标签: c# winforms clipboard copy-paste

我正在尝试复制并粘贴列表的一部分。不幸的是,当从剪贴板粘贴时,条件会找到存储的数据,但是当分配给变量时,它仍然等于null。 这是我的列表和列表项的代码。

public class ListCanvasBlocks : List<MyBlock>
{
    public List<MyBlock> MyCopySelectedObj()
    {
        var x = new List<MyBlock>();
        x.AddRange(this.Where(z => z.IsSelected));
        return x;
    }
}
[Serializable]
public class MyBlock
{
    public MyBlock(Rectangle rect, BlocksData.Shape shape,int id)
    {
        Rect = rect;
        Shape = shape;
        Text = BlocksData.Text(Shape);
        ID = id;
    }
    public string Text; 
    public bool IsSelected { get; set; } = false;
    public bool IsLocked = false;
    public int ID{ get; set; }
    public Point PointInput;
    public Point PointOutput1, PointOutput2;
    public Rectangle Rect;         
    public SolidBrush BackColor;
    public Color FontColor;
    public int FontSize;
    public BlocksData.Shape Shape{get;set;}
}

这就是我按ctrl + c / v

时的操作
      public void Copy()
    {
        Clipboard.Clear();
        Clipboard.SetData("ListCanvasBlocks", _canvObj.MyCopySelectedObj());
    }
    public void Paste()
    {
        if (Clipboard.ContainsData("ListCanvasBlocks"))
            {var test = (ListCanvasBlocks)Clipboard.GetData("ListCanvasBlocks");}
    }

Paste方法中的条件返回true但是在赋值后变量test仍为null

i'm trying use this solution

and this and few others

BlockData.Shape是枚举

3 个答案:

答案 0 :(得分:1)

您正在尝试剪切并粘贴ListCanvasBlocks,但MyCopySelectedObj()方法会返回List<MyBlock>,这是一种超类型。运行时无法自动从常规转换为特定的。

尝试更改此内容:

public class ListCanvasBlocks : List<MyBlock>
{
    public ListCanvasBlocks MyCopySelectedObj()
    {
        var x = new ListCanvasBlocks();
        x.AddRange(this.Where(z => z.IsSelected));
        return x;
    }
}

答案 1 :(得分:0)

当我尝试将变量单独添加到剪贴板时,结果发现问题是serialization。该问题已在SolodBrush中得到解决,因为它的attribute is Color只能序列化没有属性的变量。

There当我发现什么是真正的问题时,我找到了解决方案

答案 2 :(得分:0)

看起来MyCopySelectedObj()返回一个MyBlock List,它被赋予Copy()上的名称“ListCanvasBlocks”,但是当你调用Paste()时,你将剪贴板中的List转换为Object(ListCanvasBlocks)。它继承自List,但仍然不是对象类型ListCanvasBlocks。在调用Paste()时,尝试直接将List转换为该var测试。