2009-01-23 11 views
26

¿Cómo se editan elementos y subelementos en una vista de lista? Vamos a decir que tengo una vista de lista con 3 columnas y subpuntos,C#: ¿Cómo se editan elementos y subelementos en una vista de lista?

 
Car Brand | Car Name | Car Year 
Ford  | Mustang | 2000 
Dodge  | Charger | 2007 

¿Cómo voy a añadir elementos, como que a vista de lista y cómo iba a editar digamos el nombre del coche en el que jamás fila por el índice [] si Necesitaba editar en tiempo de ejecución al disparar un evento?

Respuesta

24

Si está buscando la edición "in situ" de los contenidos de ListView (específicamente los subelementos de un ListView en el modo de vista de detalles), tendrá que implementar esto usted mismo, o usar un tercero controlar.

Por defecto, el mejor que se puede lograr con un "estándar" ListView es establecer que es LabelEdit propiedad en true para permitir al usuario editar el texto de la primera columna de la ListView (suponiendo que desea permitir que un free- formato de edición de texto).

Algunos ejemplos (incluyendo el código fuente completo) del personalizados ListView 's que permiten 'in situ' de edición de los subtemas son:

C# Editable ListView
In-place editing of ListView subitems

+2

recomiendo el editor in situ. Mucho más fácil de implementar. –

+0

El segundo ejemplo es bueno, solo recuerde que debe agregar un subelemento pase lo que pase, incluso si es solo texto en blanco o si no recibe una excepción fuera de rango. – Vidar

+0

Con respecto a la segunda gran solución, no olvide que el control que envía a la GUI debe agregarse al control. no se puede simplemente enviar un "nuevo cuadro de texto", se arrojará una excepción Null (intenta manejar a su padre) – ephraim

8

Lo sentimos, no tienen suficiente representante, o habría comentado en CraigTP's answer.

Encontré la solución desde el primer enlace - C# Editable ListView, bastante fácil de usar. La idea general es:

  • identificar el SubItem que fue seleccionado y superponer un TextBox con el SubItem 'texto s sobre el SubItem
  • dar a este TextBox enfoque
  • cambio SubItem' s de texto a la de TextBox 's cuando se pierde el foco TextBox

Lo una obra alrededor para una operación aparentemente simple: - |

+0

El sitio web ya no funciona. – Phoenician

+0

Agregué un enlace a la máquina de retorno. El enlace funciona ahora –

2
private void listView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    li = listView1.GetItemAt(e.X, e.Y); 
    X = e.X; 
    Y = e.Y; 
} 

private void listView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    int nStart = X; 
    int spos = 0; 
    int epos = listView1.Columns[1].Width; 
    for (int i = 0; i < listView1.Columns.Count; i++) 
    { 
     if (nStart > spos && nStart < epos) 
     { 
      subItemSelected = i; 
      break; 
     } 

     spos = epos; 
     epos += listView1.Columns[i].Width; 
    } 
    li.SubItems[subItemSelected].Text = "9"; 
} 
8

Haga clic en los elementos en la vista de lista. Agregue un botón que editará los elementos seleccionados. Agregue el código

try 
{    
    LSTDEDUCTION.SelectedItems[0].SubItems[1].Text = txtcarName.Text; 
    LSTDEDUCTION.SelectedItems[0].SubItems[0].Text = txtcarBrand.Text; 
    LSTDEDUCTION.SelectedItems[0].SubItems[2].Text = txtCarName.Text; 
} 
catch{} 
+0

Éste muestra lo más básico que se debe saber sobre el cambio de los datos en cada elemento ListView (sub), que se puede usar en otros escenarios diferentes pero algo similares. +1 – Kaitlyn

11

utilizo un cuadro de texto oculto para editar todos los elementos de ListView/subelementos. El único problema es que el cuadro de texto debe desaparecer tan pronto como se produzca un evento fuera del cuadro de texto y la vista de lista no active el evento de desplazamiento, de modo que si desplaza la vista de lista, el cuadro de texto seguirá estando visible. Para evitar este problema que creó el evento de desplazamiento con este overrided listview.

Aquí está mi código, constatly reutilizarlo lo que podría ser de ayuda para alguien:

ListViewItem.ListViewSubItem SelectedLSI; 
private void listView2_MouseUp(object sender, MouseEventArgs e) 
{ 
    ListViewHitTestInfo i = listView2.HitTest(e.X, e.Y); 
    SelectedLSI = i.SubItem; 
    if (SelectedLSI == null) 
     return; 

    int border = 0; 
    switch (listView2.BorderStyle) 
    { 
     case BorderStyle.FixedSingle: 
      border = 1; 
      break; 
     case BorderStyle.Fixed3D: 
      border = 2; 
      break; 
    } 

    int CellWidth = SelectedLSI.Bounds.Width; 
    int CellHeight = SelectedLSI.Bounds.Height; 
    int CellLeft = border + listView2.Left + i.SubItem.Bounds.Left; 
    int CellTop =listView2.Top + i.SubItem.Bounds.Top; 
    // First Column 
    if (i.SubItem == i.Item.SubItems[0]) 
     CellWidth = listView2.Columns[0].Width; 

    TxtEdit.Location = new Point(CellLeft, CellTop); 
    TxtEdit.Size = new Size(CellWidth, CellHeight); 
    TxtEdit.Visible = true; 
    TxtEdit.BringToFront(); 
    TxtEdit.Text = i.SubItem.Text; 
    TxtEdit.Select(); 
    TxtEdit.SelectAll(); 
} 
private void listView2_MouseDown(object sender, MouseEventArgs e) 
{ 
    HideTextEditor(); 
} 
private void listView2_Scroll(object sender, EventArgs e) 
{ 
    HideTextEditor(); 
} 
private void TxtEdit_Leave(object sender, EventArgs e) 
{ 
    HideTextEditor(); 
} 
private void TxtEdit_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) 
     HideTextEditor(); 
} 
private void HideTextEditor() 
{ 
    TxtEdit.Visible = false; 
    if (SelectedLSI != null) 
     SelectedLSI.Text = TxtEdit.Text; 
    SelectedLSI = null; 
    TxtEdit.Text = ""; 
} 
Cuestiones relacionadas