我正在编写一个C#.NET WinForms应用程序,它包含两个DataGridView控件,每个控件都有自己的List:
DataGridView1,List1 DataGridView2,List2
FYI:DataItem是一个由整数,字符串,布尔值等组成的类,每个datagridview控件中列出的所有项也都列在相应的List中。
用户将右键单击DataGridView1,然后在生成的上下文菜单中,单击“复制项”将DataItem从List1复制到剪贴板...
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();
}
这是上下文菜单的Opening EventHandler的代码......
private void ctxtContextMenu_Opening(object sender, CancelEventArgs e)
{
// If clipboard contains a DataItem, enable ctxtPasteItem...
if (Clipboard.GetDataObject() is DataItem)
ctxPasteQuestion.Enabled = true;
}
在上面的方法“PasteDataItem()”中,会发生异常:
发生了System.InvalidCastException 的HResult = 0x80004002 Message =无法将类型为“System.Windows.Forms.DataObject”的对象强制转换为“DataItem”。
显然,我要么没有正确地将DataItem复制到剪贴板,要么我没有正确地从剪贴板中检索它。一个可能的原因是我没有正确地转换DataItem。我还没有找到任何关于使用剪贴板构建,复制和粘贴类实例的在线教程。这甚至是可能的,如果是这样,那么从剪贴板获取该类实例的正确方法是什么?
答案 0 :(得分:0)
Clipboard.GetDataObject()直接返回 IDataObject ,而不是您存储的数据。然后,您可以使用返回的 IDataObject 来访问存储的数据。 您可能想要的是以下内容:
var clipboardDataObject = Clipboard.GetDataObject();
dataitem = (DataItem)clipboardDataObject.GetData(typeof(DataItem));
尽管理想情况下,您可以使代码更加健壮,以处理错误等问题。 此外,这意味着 ctxtContextMenu_Opening 上的代码可能无法正常工作。