Comment modifier des éléments et des sous-éléments dans une vue de liste? Disons que j'ai une vue de liste avec 3 colonnes et sous-éléments,
Marque de voiture | Nom de la voiture | Année de la voiture Ford | Mustang | 2000 Dodge | Chargeur | 2007
Comment ajouter des éléments de ce type à la vue de liste et comment modifier, disons, le nom de la voiture sur quelle ligne par index [] si je devais modifier au moment de l'exécution lors du déclenchement d'un événement?
Si vous recherchez une modification "sur place" du contenu d'un ListView
(en particulier les sous-éléments d'un ListView en mode d'affichage détaillé), vous devrez l'implémenter vous-même ou utiliser un troisième contrôle des partis.
Par défaut, le mieux que vous puissiez obtenir avec un ListView
"standard" est de définir sa propriété LabelEdit
sur true pour permettre à l'utilisateur de modifier le texte de la première colonne du ListView
(en supposant que vous souhaitez autoriser une modification de texte au format libre).
Voici quelques exemples (y compris le code source complet) de ListView
personnalisés qui permettent la modification "sur place" des sous-éléments:
ListView modifiable C #
Modification sur place des sous-éléments ListView
J'utilise une zone de texte cachée pour modifier tous les éléments/sous-éléments de la vue de liste. Le seul problème est que la zone de texte doit disparaître dès qu'un événement se produit en dehors de la zone de texte et que la vue de liste ne déclenche pas l'événement de défilement, donc si vous faites défiler la vue de liste, la zone de texte sera toujours visible. Pour contourner ce problème, j'ai créé l'événement Scroll avec ceci vue de liste remplacée.
Voici mon code, je le réutilise constamment pour qu'il puisse être utile à quelqu'un:
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 = "";
}
Désolé, je n'ai pas assez de représentants, ou j'aurais commenté réponse CraigTP .
J'ai trouvé la solution du 1er lien - C # Editable ListView , assez facile à utiliser. L'idée générale est de:
SubItem
qui a été sélectionné et superposer un TextBox
avec le texte de SubItem
sur le SubItem
TextBox
focusSubItem
en celui de TextBox
lorsque TextBox
perd le focusQuelle solution de contournement pour une opération apparemment simple: - |
Cliquez sur les éléments dans la vue de liste. Ajoutez un bouton qui modifiera les éléments sélectionnés. Ajoutez le code
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{}
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";
}