2017-08-04 49 views
-1

我试图复制并粘贴部分列表。不幸的是,当从剪贴板粘贴时,条件查找存储的数据,但是当分配给变量时,它仍然等于空。 这是我的代码列表和列表项。c#粘贴列表<MyObj>返回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");} 
    } 

状况的粘贴方法返回true,但可变测试仍然是空后分配新建分配FY

i'm trying use this solution

and this and few others

BlockData.Shape i s枚举

回答

0

在当我试图单独变量添加到剪贴板的那一刻,事实证明,问题是serialization。该问题已在SolodBrush中解决,因为它的attribute is Color,只有没有属性的变量才能被序列化。

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

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; 
    } 
} 
+0

我花了一段时间才明白,因为他说测试是空的,而不是抛出异常:(或者他可以将GetData的结果投给列表。 – hoodaticus

+0

我之前尝试过,但我确实再次尝试。 ,而粘贴仍然分配null.Worst的情况是,我无法验证问题是否与复制或粘贴。我知道只有在剪贴板格式兼容 – Robert

+0

我终于发现一个问题 问题是在SolidBrush当它被复制时,不幸的是,当你粘贴时,我们得到null。你知道如何解决它吗? – Robert

0

貌似MyCopySelectedObj()返回一个被分配到复印()这个名字“ListCanvasBlocks” MyBlock的名单,但是当你调用粘贴( ),您将剪贴板中的列表转换为对象(ListCanvasBlocks)。它从List继承,但仍然不是对象类型ListCanvasBlocks。当您调用Paste()时,尝试直接转换为列表到该var测试。