C #: ¿Cómo se editan elementos y subelementos en una vista de lista?

¿Cómo se editan elementos y subelementos en una vista de lista? Digamos que tengo una vista de lista con 3 columnas y subelementos,

 Marca del coche |  Nombre del auto |  Año del automóvil
 Ford |  Mustang |  2000
 Dodge |  Cargador |  2007

¿Cómo agregaría elementos como ese a listview y cómo editaría digamos el nombre del coche en cada fila por índice [] si tuviera que editar en tiempo de ejecución al disparar un evento?

Si está buscando la edición “in situ” de los contenidos de un ListView (específicamente los subelementos de un ListView en el modo de vista de detalles), deberá implementarlo usted mismo o usar un control de terceros.

De forma predeterminada, lo mejor que puede lograr con un ListView “estándar” es establecer su propiedad LabelEdit en verdadero para permitirle al usuario editar el texto de la primera columna de ListView (suponiendo que desea permitir una edición de texto de formato libre) .

Algunos ejemplos (incluido el código fuente completo) de los ListView personalizados que permiten la edición “en el lugar” de los subtemas son:

C # Editable ListView
Edición in situ de los subelementos de ListView

Uso un cuadro de texto oculto para editar todos los elementos / subelementos de la lista. 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 eludir este problema, creé el evento Scroll con esta vista de lista anulada.

Aquí está mi código, lo reutilizo constantemente para que pueda ser de ayuda para alguien:

 ListViewItem.ListViewSubItem SelectedLSI; private void listView2_MouseUp(object sender, MouseEventArgs e) { ListViewHitTestInfo i = listView2.HitTest(eX, eY); 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 = ""; } 

Haga clic en los elementos en la vista de lista. Agregue un botón que editará los elementos seleccionados. Agrega 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{} 

Lo siento, no tengo suficientes representantes, o habría comentado la respuesta de CraigTP .

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

  • identificar el SubItem que se seleccionó y superponer un TextBox con el texto del SubItem sobre el SubItem
  • dale este enfoque a TextBox
  • cambie el texto de SubItem al de TextBox cuando TextBox pierde foco

Qué solución para una operación aparentemente simple: – |

 private void listView1_MouseDown(object sender, MouseEventArgs e) { li = listView1.GetItemAt(eX, eY); X = eX; Y = eY; } 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"; }