C #: come modifichi elementi e sottotitoli in un listview?

Come modifichi elementi e sottotitoli in un listview? Diciamo che ho una listview con 3 colonne e sottotemi,

 Marca dell'automobile |  Nome auto |  Anno dell'automobile
 Ford |  Mustang |  2000
 Schivare |  Caricatore |  2007

Come faccio ad aggiungere elementi come quello a listview e come modifico diciamo il Car Name su cui gira sempre per indice [] se dovessi modificare in runtime all’triggerszione di un evento?

Se stai cercando la modifica “sul posto” di un contenuto di ListView (in particolare i dettagli di un ListView in modalità di visualizzazione dettagli), dovrai implementarlo tu stesso o utilizzare un controllo di terze parti.

Per impostazione predefinita, il meglio che è ansible ottenere con un ListView “standard” è impostare la proprietà LabelEdit su true per consentire all’utente di modificare il testo della prima colonna di ListView (presupponendo che si desideri consentire una modifica di testo in formato libero) .

Alcuni esempi (incluso il codice sorgente completo) di ListView personalizzati che consentono la modifica “sul posto” degli elementi secondari sono:

C # ListView modificabile
Modifica sul posto di elementi secondari di ListView

Io uso una casella di testo nascosta per modificare tutti gli elementi di elenco / sottotemi. L’unico problema è che la casella di testo deve scomparire non appena si verifica un evento al di fuori della casella di testo e la lista non triggers l’evento di scorrimento, quindi se si scorre la visualizzazione della lista la casella di testo sarà ancora visibile. Per aggirare questo problema, ho creato l’evento Scroll con questa listview sovrascritta.

Ecco il mio codice, lo riuso costantemente così potrebbe essere d’aiuto per qualcuno:

 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 = ""; } 

Fai clic sugli elementi nella visualizzazione elenco. Aggiungi un pulsante che modificherà gli elementi selezionati. Aggiungi il codice

 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{} 

Spiacente, non ho abbastanza rep, o avrei commentato la risposta di CraigTP .

Ho trovato la soluzione dal 1 ° link – C # Editable ListView , abbastanza facile da usare. L’idea generale è di:

  • identificare il SubItem che è stato selezionato e sovrapporre un TextBox con il testo del SubItem sul SubItem
  • dare questo focus TextBox
  • cambia il testo di SubItem in quello di TextBox quando TextBox perde lo stato SubItem

Che soluzione alternativa per un’operazione apparentemente semplice: – |

 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"; }