2010-06-12 15 views
7

C'è un modo semplice di aggiungere copia-incolla per un listview, o dovrei semplicemente passare a DataGridView invece?Visualizzazione elenco con copia-incolla

La mia applicazione è simile a una rubrica, contiene e-mail, numeri ecc. Dove la copia incolla sarebbe utile.

risposta

1

Non è molto difficile da fare copia manuale e incolla, basta mettere in un gestore di eventi per KeyDown (o forse è KeyPress non ricordo ma abbastanza sicuro che sia uno di loro) e controllare ciò che si preme il tasto, cercando in e.KeyCode e controllare se e.Control è vero. Se è uno di x, c o v è sufficiente chiamare il numero Clipboard.SetText o Clipboard.GetText per scrivere/leggere negli appunti.
Vedere here per la documentazione MSDN della classe Clipboard.

È possibile aggiungere un menu di scelta rapida con Copia e incolla su ListView anche per completarlo.

+0

Il problema è che riesco solo a copiare l'intera riga, a meno che non ci siano alcuni trucchetti per selezionare una cella. – Zubirg

+0

@Zubirg: Sì, ho dimenticato che non hai veramente celle in un 'ListView', potrebbe essere più facile passare a un' DataGridView'. Tuttavia, se si desidera mantenere il 'ListView', si potrebbe fare qualcosa come gestire gli eventi' Click' e 'MouseDown' su di esso per calcolare quale sottotema è stato cliccato e quindi cambiare il' BackColor' di quel sottotitolo per farlo apparire selezionato e quindi potresti gestire il copia e incolla solo per quel sottoelemento. Dovresti assicurarti di impostare 'UseItemStyleForSubItems = false;' sull'articolo, altrimenti i colori non verranno mostrati nei sottitemi. –

11

L'esempio che segue gestisce il Ctrl-C come una copia al comando appunti, e copia il valore della seconda colonna da tutte le righe selezionate:

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

Riferimenti:

  1. What is the KeyChar for Ctrl+C and Ctrl+V in C# per ottenere le chiavi e il gestore di eventi appropriato.
  2. Copy ListView to Clipboard in VB.NET, C#, and VB6 per un esempio completo di copia di ListView negli Appunti.
+0

Buona soluzione, dovevo farlo con l'evento 'KeyDown'. 'KeyUp' non ha funzionato, perché premendo' c' si selezionava automaticamente la prima voce in ListBox che iniziava con 'c', rendendo la mia selezione multipla solo una singola. – derFunk

0

Il mio requisito era quello di aggiungere un pulsante per copiare un elenco di numeri seriali negli appunti. Ho aggiunto il pulsante nel modo normale e ho aggiunto il seguente metodo:

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); 
    } 
} 
Problemi correlati