Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.NET WinForms如何从一个列表复制类的实例<;类别>;转到另一个列表<;类别>;使用剪贴板_C#_.net_Winforms_Datagridview_Clipboard - Fatal编程技术网

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

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

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

DataGridView1,列表1 DataGridView2,列表2

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

用户将右键单击DataGridView1,然后在生成的上下文菜单中,单击“复制项”将DataItem从列表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()”中,发生异常:

发生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中所需要做的。如何编写将项目复制到剪贴板的代码?上面显示的内容不起作用?它会抛出异常吗?