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:
SubItem
che è stato selezionato e sovrapporre un TextBox
con il testo del SubItem
sul SubItem
TextBox
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"; }