C# .NET WinForms<class> <class> 如何使用剪贴板将类的实例从一个列表复制到另一个列表



我正在编写一个C# .NET WinForms应用程序,其中包含两个DataGridView控件,每个控件都有自己的List:

数据网格视图1, 列表1 数据网格视图2, 列表2

仅供参考:DataItem 是一个由整数、字符串、布尔值等组成的类,每个 datagridview 控件中列出的所有项也列在其相应的列表中。

用户将右键单击 DataGridView1,然后在生成的上下文菜单中,单击"复制项"以将数据项从列表 1 复制到剪贴板...

private void ctxtContextMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int SelectedRowIndex = DataGridView1.SelectedRows[0].Index;
if (ctxtCopyItem == e.ClickedItem)
{
Clipboard.SetDataObject(List1[SelectedRowIndex]);
}
else if (ctxtPasteItem == e.ClickedItem)
{
PasteDataItem();
}
}

然后,用户将转到 DataGridView2,右键单击它,然后在上下文菜单中单击"粘贴项"以将该 DataItem 添加到 DataGridView2 和 List2...

private void PasteDataItem()
{
DataItem dataitem = new DataItem();
dataitem = Clipboard.GetDataObject());   // This line is where the error occurs.
List2.Add(dataItem); 
UpdateDataGridView2();
}

这是上下文菜单的打开事件处理程序的代码...

private void ctxtContextMenu_Opening(object sender, CancelEventArgs e)
{
// If clipboard contains a DataItem, enable ctxtPasteItem...
if (Clipboard.GetDataObject() is DataItem)
ctxPasteQuestion.Enabled = true;
}

在上面的方法"PasteDataItem(("中,发生异常:

系统无效转换异常发生 HResult=0x80004002 消息=无法将类型为"System.Windows.Forms.DataObject"的对象强制转换为类型"DataItem"。

显然,我要么没有正确地将数据项复制到剪贴板,要么没有正确地从剪贴板中检索它。一个可能的原因是我没有正确转换数据项。我还没有找到任何关于使用剪贴板投射、复制和粘贴类实例的在线教程。这是否可能,如果是这样,让该类实例进出剪贴板的正确方法是什么?

Clipboard.GetDataObject((返回一个IDataObject,而不是直接返回您存储的数据。然后,您可以使用返回的IDataObject访问存储的数据。 您可能想要以下内容:

var clipboardDataObject = Clipboard.GetDataObject();
dataitem = (DataItem)clipboardDataObject.GetData(typeof(DataItem));

尽管理想情况下,您将使该代码更健壮以处理错误等。 此外,这意味着您在ctxtContextMenu_Opening上的代码也可能没有按预期工作。

最新更新