2017-08-04 29 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測試。