2010-06-12 10 views
7

Czy istnieje prosty sposób dodawania kopiowania i wklejania do listy, czy powinienem zamiast tego przełączyć się na DataGridView?Listview z kopiuj-wklej

Moja aplikacja jest jak książka adresowa, zawiera e-maile, cyfry itp., W których kopiowanie wklejenia byłoby przydatne.

Odpowiedz

1

To nie jest bardzo trudne do wykonania ręcznego kopiowania i wklejania, wystarczy umieścić w obsługi zdarzeń dla KeyDown (a może to KeyPress nie pamiętam, ale dość pewny, że to jeden z nich) i sprawdzić, co naciśnięciu klawisza patrząc na e.KeyCode i sprawdź, czy e.Control jest prawdziwe. Jeśli jest to jeden z x, c lub v po prostu zadzwoń Clipboard.SetText lub Clipboard.GetText, aby pisać/czytać do/ze schowka.
Patrz dokumentacja here dla dokumentacji MSDN klasy Clipboard.

Można dodać menu kontekstowe za pomocą polecenia Kopiuj i Wklej także do listy ListView, aby zakończyć.

+0

Problem polega na tym, że udało mi się skopiować tylko cały wiersz, chyba że jest kilka fajnych sztuczek do wyboru komórki. – Zubirg

+0

@Zubirg: Tak, zapomniałem, że tak naprawdę nie masz komórek w 'ListView', może być łatwiej przejść do' DataGridView'. Jeśli jednak chcesz trzymać się 'ListView' możesz zrobić coś takiego jak obsługa zdarzeń' Click' i 'MouseDown', aby obliczyć, która subitem została kliknięta, a następnie zmienić' BackColor' tego subitem, aby wyglądał na wybrany a następnie można obsługiwać kopiowanie i wklejanie tylko dla tego podelementu. Należy się upewnić, że ustawiono "UseItemStyleForSubItems = false;" na elemencie, w przeciwnym razie kolory nie będą wyświetlane w podelementach. –

11

Poniższy przykład uchwyty Ctrl-C kopię do polecenia schowka, a kopie wartości w drugiej kolumnie na wszystkich wybranych rzędach

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

Literatura:

  1. What is the KeyChar for Ctrl+C and Ctrl+V in C# uzyskać klucze i właściwa obsługa zdarzeń.
  2. Copy ListView to Clipboard in VB.NET, C#, and VB6 dla pełnego przykładu kopiowania ListView do Schowka.
+0

Dobre rozwiązanie, musiałem to zrobić po wydaniu 'KeyDown'. 'KeyUp' nie działał, ponieważ po naciśnięciu' c' automatycznie wybierał pierwszy wpis w ListBox, który zaczynał się od 'c', czyniąc mój multiselection tylko jednym. – derFunk

0

Moim żądaniem było dodanie przycisku do skopiowania listy numerów seryjnych do schowka. Dodałem przycisk w zwykły sposób, po czym dodałem następującą metodę:

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); 
    } 
} 
Powiązane problemy