2017-07-17 4 views
0

J'écris une application C# WinForms .NET qui contient deux contrôles DataGridView, chacun avec sa propre liste:C# WinForms .NET Comment copier instance de la classe d'une liste <class> à une autre liste <class> en utilisant Presse-papiers

DataGridView1, List1 DataGridView2, List2

Pour votre information: DataItem est une classe constituée par des entiers, des chaînes, booléens, etc., et tous les éléments énumérés dans chaque contrôle DataGridView sont également répertoriés dans la liste correspondante.

L'utilisateur clic droit sur un DataGridView1 et dans le menu contextuel résultant, cliquez sur « Copier l'élément » pour copier un DataItem de Liste1 le presse-papiers ...

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(); 
     } 
    } 

L'utilisateur sera alors DataGridView2, faites un clic droit dessus et dans le menu contextuel, cliquez sur « Coller l'élément » pour ajouter que DataItem à DataGridView2 et List2 ...

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

et voici le code pour le gestionnaire d'événements d'ouverture du menu contextuel ...

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

Dans le procédé "PasteDataItem()" ci-dessus, une exception se produit:

System.InvalidCastException survenue HResult = 0x80004002 Message = Incapable de coulée objet de type 'System.Windows.Forms.DataObject' à tapez 'DataItem'.

Apparemment, je ne copie pas correctement DataItem dans le Presse-papiers ou je ne le récupère pas correctement dans le Presse-papiers. Une cause possible est que je ne lance pas correctement le DataItem. Je n'ai trouvé aucun didacticiel en ligne sur le moulage, la copie et le collage d'une instance d'une classe à l'aide du presse-papiers. Est-ce même possible et si oui, quelle est la bonne façon d'obtenir cette instance de classe vers et depuis le Presse-papiers?

+2

Si les deux DataGridViews se trouvent dans votre application, pourquoi utilisez-vous le Presse-papiers? prendre une rangée de l'un et l'insérer dans l'autre. –

+0

Je pense juste passer un élément en tant que paramètre, mais je veux utiliser le presse-papier dans le cas où l'utilisateur veut passer un élément de DataGridView1 dans une instance de l'application à un autre DataGridView similaire dans une autre instance de l'application. C'est un peu bizarre, je sais, mais j'aimerais que l'utilisateur puisse le faire. – manicdrummer

+0

Vous pouvez toujours transmettre des données entre des instances de votre application via tcp/ip, des tubes nommés, etc. Il vous suffit de sérialiser les données d'une extrémité et de les désérialiser de l'autre. Donc vous n'avez toujours pas besoin de presse-papiers. Mais OK, fais comme tu veux. –

Répondre

0

Clipboard.GetDataObject() retourne uneIDataObject et non vos données stockées directement. Ensuite, vous pouvez utiliser IDataObject pour accéder à vos données stockées. potentiellement ce que vous voulez est la suivante:

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

Bien qu'idéalement vous rendre ce code plus robuste pour gérer les erreurs et autres. En outre, cela signifie que votre code sur ctxtContextMenu_Opening peut ne pas fonctionner comme prévu non plus.

+0

Merci pour votre réponse, Fredy. Votre exemple de code semble être ce que je vais devoir faire pour coller l'élément du presse-papiers dans un datagridview. Comment écrire du code pour copier un élément dans le presse-papiers? – manicdrummer

+0

Ce que vous avez montré ci-dessus ne fonctionne pas? Est-ce qu'il lance une exception? –