C#.NET WinForms如何从一个列表复制类的实例<;类别>;转到另一个列表<;类别>;使用剪贴板
我正在编写一个C#.NET WinForms应用程序,其中包含两个DataGridView控件,每个控件都有自己的列表: DataGridView1,列表1 DataGridView2,列表2 仅供参考:DataItem是一个由整数、字符串、布尔值等组成的类,每个datagridview控件中列出的所有项也会列在相应的列表中 用户将右键单击DataGridView1,然后在生成的上下文菜单中,单击“复制项”将DataItem从列表1复制到剪贴板C#.NET WinForms如何从一个列表复制类的实例<;类别>;转到另一个列表<;类别>;使用剪贴板,c#,.net,winforms,datagridview,clipboard,C#,.net,Winforms,Datagridview,Clipboard,我正在编写一个C#.NET WinForms应用程序,其中包含两个DataGridView控件,每个控件都有自己的列表: DataGridView1,列表1 DataGridView2,列表2 仅供参考:DataItem是一个由整数、字符串、布尔值等组成的类,每个datagridview控件中列出的所有项也会列在相应的列表中 用户将右键单击DataGridView1,然后在生成的上下文菜单中,单击“复制项”将DataItem从列表1复制到剪贴板 private void ctxtCont
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()”中,发生异常:
发生System.InvalidCastException异常
HResult=0x80004002
消息=无法将类型为“System.Windows.Forms.DataObject”的对象强制转换为类型为“DataItem”
显然,我要么没有正确地将数据项复制到剪贴板,要么没有正确地从剪贴板检索数据项。一个可能的原因是我没有正确地转换数据项。我还没有找到任何关于使用剪贴板强制转换、复制和粘贴类实例的在线教程。这可能吗?如果可能的话,从剪贴板获取类实例的正确方法是什么?剪贴板。GetDataObject()返回IDataObject,而不是直接返回存储的数据。然后,可以使用返回的IDataObject访问存储的数据。
您可能需要以下内容:
var clipboardDataObject = Clipboard.GetDataObject();
dataitem = (DataItem)clipboardDataObject.GetData(typeof(DataItem));
尽管在理想情况下,您可以使代码更健壮地处理错误等。
此外,这意味着您在ctxtContextMenu_打开时的代码也可能无法按预期工作。如果两个DataGridView都在您的应用程序中,为什么要使用剪贴板?从一个实例中获取一行并插入到另一个实例中。我正在考虑将一个项目作为参数传递,但我希望使用剪贴板,以防用户希望将一个项目从应用程序的一个实例中的DataGridView1传递到应用程序的另一个实例中类似的DataGridView。我知道这有点奇怪,但我希望用户能够做到这一点。你仍然可以通过tcp/ip、命名管道等在应用程序实例之间传递数据。你所需要的只是从一端序列化数据,另一端反序列化数据。所以你仍然不需要剪贴板。但是好吧,你想怎么做就怎么做。谢谢你的回复,弗雷迪。您的代码示例似乎就是我将项目从剪贴板粘贴到datagridview中所需要做的。如何编写将项目复制到剪贴板的代码?上面显示的内容不起作用?它会抛出异常吗?