web-dev-qa-db-fra.com

C #: Comment éditez-vous les éléments et sous-éléments dans une vue de liste?

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?

29
Ted Paulson

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

24
CraigTP

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

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:

  • identifier le SubItem qui a été sélectionné et superposer un TextBox avec le texte de SubItem sur le SubItem
  • donner ce TextBox focus
  • changer le texte de SubItem en celui de TextBox lorsque TextBox perd le focus

Quelle solution de contournement pour une opération apparemment simple: - |

8
lazo

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{}
8
Ryan
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";
}
2
ahmad