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

时间:2017-07-17 22:06:24

标签: c# .net winforms datagridview clipboard

我正在编写一个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。我还没有找到任何关于使用剪贴板构建,复制和粘贴类实例的在线教程。这甚至是可能的,如果是这样,那么从剪贴板获取该类实例的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

尽管理想情况下,您可以使代码更加健壮,以处理错误等问题。 此外,这意味着 ctxtContextMenu_Opening 上的代码可能无法正常工作。