c# 粘贴列表<MyObj> return null
c# Paste List<MyObj> return null
我正在尝试复制和粘贴列表的一部分。不幸的是,当从剪贴板粘贴时,条件找到了存储的数据,但是当分配给变量时它仍然等于 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 方法中的条件return true 但赋值后变量 test 仍然为 null
i'm trying use this solution
and this and few others
BlockData.Shape 是枚举
您正在尝试剪切和粘贴一个 ListCanvasBlocks
,但是 MyCopySelectedObj()
方法 returns 一个 List<MyBlock>
,这是一个超类型。运行时无法自动从通用转换为特定。
尝试改变这个:
public class ListCanvasBlocks : List<MyBlock>
{
public ListCanvasBlocks MyCopySelectedObj()
{
var x = new ListCanvasBlocks();
x.AddRange(this.Where(z => z.IsSelected));
return x;
}
}
当我尝试将变量单独添加到剪贴板时,发现问题出在serialization
。问题在SolodBrush
解决了,因为它attribute is Color
,只有没有属性的变量才能序列化。
There 当我发现真正的问题时,我找到了解决方案
看起来像 MyCopySelectedObj() returns MyBlock 的列表,它在 Copy() 上分配给名称 "ListCanvasBlocks",但是当您调用 Paste() 时,您将列表投射到剪贴板到对象 (ListCanvasBlocks)。它继承自List,但仍然不是对象类型ListCanvasBlocks。尝试在调用 Paste() 时直接将 List 转换为该 var 测试。
我正在尝试复制和粘贴列表的一部分。不幸的是,当从剪贴板粘贴时,条件找到了存储的数据,但是当分配给变量时它仍然等于 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 方法中的条件return true 但赋值后变量 test 仍然为 null
i'm trying use this solution
and this and few others
BlockData.Shape 是枚举
您正在尝试剪切和粘贴一个 ListCanvasBlocks
,但是 MyCopySelectedObj()
方法 returns 一个 List<MyBlock>
,这是一个超类型。运行时无法自动从通用转换为特定。
尝试改变这个:
public class ListCanvasBlocks : List<MyBlock>
{
public ListCanvasBlocks MyCopySelectedObj()
{
var x = new ListCanvasBlocks();
x.AddRange(this.Where(z => z.IsSelected));
return x;
}
}
当我尝试将变量单独添加到剪贴板时,发现问题出在serialization
。问题在SolodBrush
解决了,因为它attribute is Color
,只有没有属性的变量才能序列化。
There 当我发现真正的问题时,我找到了解决方案
看起来像 MyCopySelectedObj() returns MyBlock 的列表,它在 Copy() 上分配给名称 "ListCanvasBlocks",但是当您调用 Paste() 时,您将列表投射到剪贴板到对象 (ListCanvasBlocks)。它继承自List,但仍然不是对象类型ListCanvasBlocks。尝试在调用 Paste() 时直接将 List 转换为该 var 测试。