2010-06-12 23 views
7

¿Hay alguna manera fácil de agregar copiar y pegar para una vista de lista, o debería simplemente cambiar a DataGridView?Vista de lista con copiar y pegar

Mi aplicación es como una libreta de direcciones, contiene correos electrónicos, números, etc. en los que copiar y pegar sería útil.

Respuesta

1

No es muy difícil de hacer copiar y pegar manual, sólo hay que poner en un controlador de eventos para KeyDown (o tal vez es KeyPress No puedo recordar, pero bastante seguro de que es uno de ellos) y comprobar lo que se pulsa la tecla examinado e.KeyCode y verifique si e.Control es verdadero. Si es uno de x, c o v solo llame al Clipboard.SetText o Clipboard.GetText para escribir/leer desde/hacia el portapapeles.
Consulte here para la documentación de MSDN de la clase Clipboard.

Puede agregar un menú contextual con Copiar y pegar en el ListView también para completarlo.

+0

El problema es que solo logro copiar toda la fila, a menos que haya algunos trucos para seleccionar una celda. – Zubirg

+0

@Zubirg: Sí, olvidé que realmente no tienes células en un 'ListView', podría ser más fácil cambiar a' DataGridView'. Sin embargo, si quieres quedarte con 'ListView' puedes hacer algo como manejar los eventos' Click' y 'MouseDown' para calcular en qué subítem se hizo clic y luego cambiar el' BackColor' de ese subelemento para que se vea seleccionado y luego podrías manejar copiar y pegar solo para ese subelemento. Debería asegurarse de establecer 'UseItemStyleForSubItems = false;' en el elemento, de lo contrario los colores no se mostrarán en los subelementos. –

11

El siguiente ejemplo se ocupa de las teclas Ctrl-C como una copia de la orden de portapapeles, y copia el valor de la segunda columna de todas las filas seleccionadas:

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

Referencias:

  1. What is the KeyChar for Ctrl+C and Ctrl+V in C# llegar las teclas y el controlador de eventos adecuado.
  2. Copy ListView to Clipboard in VB.NET, C#, and VB6 para obtener un ejemplo completo de copia de ListView en el Portapapeles.
+0

Buena solución, solo tuve que hacer eso con el evento 'KeyDown'. 'KeyUp' no funcionó, porque al presionar' c' estaba auto-seleccionando la primera entrada en el ListBox que comenzó con 'c', haciendo que mi multiselección sea solo una. – derFunk

0

Mi requisito era agregar un botón para copiar una lista de números de serie al portapapeles. Agregué el botón en la forma normal y luego agregué el siguiente método:

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); 
    } 
} 
Cuestiones relacionadas