2010-06-12 10 views
7

Existe-t-il un moyen facile d'ajouter du copier-coller pour une liste, ou devrais-je simplement passer à DataGridView?Listview avec copier-coller

Mon application est un peu comme un carnet d'adresses, il contient des e-mails, des numéros, etc où copier coller serait utile.

Répondre

1

Il est pas très difficile de faire une copie manuelle et coller, il suffit de mettre dans un gestionnaire d'événements pour KeyDown (ou peut-être il est KeyPress ne me souviens pas, mais assez sûr qu'il est l'un d'entre eux) et vérifiez que la touche est pressée en regardant e.KeyCode et vérifiez si e.Control est vrai. Si c'est l'un des x, c ou v, appelez Clipboard.SetText ou Clipboard.GetText pour écrire/lire dans le presse-papiers.
Voir here pour la documentation MSDN de la classe Clipboard.

Vous pouvez également ajouter un menu contextuel avec Copier et Coller dans ListView pour le compléter.

+0

Le problème avec cela est que je réussis seulement à copier la ligne entière, à moins qu'il y ait quelques astuces pour sélectionner une cellule. – Zubirg

+0

@Zubirg: Oui, j'ai oublié que vous n'avez pas vraiment de cellules dans un ListView, il pourrait être plus facile de passer à un DataGridView. Cependant, si vous voulez coller avec 'ListView', vous pouvez faire quelque chose comme manipuler les événements' Click' et 'MouseDown' pour calculer le sous-élément sur lequel vous avez cliqué puis changer le' BackColor' de ce sous-élément pour le faire apparaître et vous pouvez gérer le copier-coller pour ce sous-élément. Vous devez vous assurer de définir 'UseItemStyleForSubItems = false;' sur l'élément, sinon les couleurs n'apparaîtront pas sur les sous-éléments. –

11

L'exemple traite ci-dessous les touches Ctrl-C comme une copie à la commande du presse-papiers, et des copies de la valeur de la deuxième colonne de toutes les lignes sélectionnées:

private void resultsListView_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (sender != resultsListView) return; 

     if (e.Control && e.KeyCode == Keys.C) 
      CopySelectedValuesToClipboard(); 
    } 

    private void CopySelectedValuesToClipboard() 
    { 
     var builder = new StringBuilder(); 
     foreach (ListViewItem item in resultsListView.SelectedItems) 
      builder.AppendLine(item.SubItems[1].Text); 

     Clipboard.SetText(builder.ToString()); 
    } 

Références:

  1. What is the KeyChar for Ctrl+C and Ctrl+V in C# pour obtenir les clés et le gestionnaire d'événement approprié.
  2. Copy ListView to Clipboard in VB.NET, C#, and VB6 pour un exemple complet de copie de ListView dans le Presse-papiers.
+0

Bonne solution, je devais le faire avec l'événement 'KeyDown'. 'KeyUp' ne fonctionnait pas, parce qu'en appuyant sur le' c' il sélectionnait automatiquement la première entrée dans le ListBox qui a commencé avec un 'c', rendant ma multiselection à un seul. – derFunk

0

Mon exigence était d'ajouter un bouton pour copier une liste de numéros de série dans le presse-papiers. J'ai ajouté le bouton de la manière habituelle et ajouté la méthode suivante:

private void btnClipboard_Click(object sender, EventArgs e) 
{ 
    String clipText = string.Empty; 
    foreach (ListViewItem item in lstSerials.Items) 
    { 
     clipText += item.SubItems[0].Text; 
     clipText += Environment.NewLine; 
    } 
    if (!String.IsNullOrEmpty(clipText)) 
    { 
     Clipboard.SetText(clipText); 
    } 
}