Vous êtes sur la page 1sur 7

12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

iliser un contrôle ComboBox pour


odifier les données dans un contrôle
tView dans Visual CSharp
/2020 • 6 minutes de lecture •

cet article
ription de la technique
r le contrôle ListView hérité
r l'exemple d'application
ez que cela fonctionne

rticle montre comment utiliser un contrôle ComboBox pour modifier les données
un contrôle ListView. Cette méthode remplace l'approche de zone de texte
ard de modification des données dans un contrôle ListView.

on originale du produit:   Visual C #


éro KB d'origine:   320344

scription de la technique
ilisant la LabelEdit propriété du contrôle ListView, vous pouvez autoriser
sateur à modifier le contenu du contrôle ListView. Pour modifier les données dans
ntrôle ListView, vous pouvez utiliser une zone de texte standard. Parfois, il est utile
ir un autre contrôle pour modifier le contrôle. Cet article simule comment utiliser
ontrôle ComboBox pour modifier les données dans un ListView lorsque le ListView
n mode Détails.

ue l'utilisateur sélectionne une ligne dans ListView, un calcul est effectué pour
ser le rectangle de délimitation de la première colonne de la ligne sur laquelle
sateur a cliqué. Ce calcul tient compte du fait que la colonne peut ne pas être
e ou peut ne pas être entièrement visible lorsque la ligne est cliquée et lorsque la
de liste déroulante est dimensionnée et affichée de manière appropriée.

e le positionnement et le dimensionnement de la zone de liste déroulante, cet


ple surveille également deux messages sur le contrôle ListView: WM_VSCROLL et
SCROLL . Ces messages se produisent chaque fois que l'utilisateur fait défiler le
ôle ListView verticalement ou horizontalement. Étant donné que le ComboBox ne
as physiquement partie du contrôle ListView, le ComboBox ne défile pas

https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 1/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

matiquement avec le ListView. Ainsi, chaque fois que l'un de ces deux messages se
uit, la zone de liste déroulante doit être masquée. Pour surveiller ces messages,
créez une UserControl classe personnalisée qui hérite de la classe ListView. Dans ce
ôle personnalisé, la WndProc méthode est remplacée pour permettre à tous les
ages d'être vérifiés pour le défilement.

éer le contrôle ListView hérité


Démarrez Microsoft Visual Studio .NET.

Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur Projet .

Dans la boîte de dialogue Nouveau projet , cliquez sur Projets Visual C # sous
Types de projets , puis cliquez sur Bibliothèque de contrôles Windows sous
Modèles .

Remplacez tout le code de la UserControl classe par le code suivant:

C# = Copie

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace InheritedListView
{
/// <summary>
/// Summary description for UserControl1.
/// </summary>
public class MyListView : System.Windows.Forms.ListView
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public MyListView()
{
// This call is required by the Windows.Forms Form De-
signer.
InitializeComponent();
// TODO: Add any initialization after the InitForm call
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)

https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 2/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

{
if (disposing)
{
if (components != null)
components.Dispose();
}
base.Dispose(disposing);
}

#region Component Designer generated code


/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion

private const int WM_HSCROLL = 0x114;


private const int WM_VSCROLL = 0x115;

protected override void WndProc(ref Message msg)


{
// Look for the WM_VSCROLL or the WM_HSCROLL messages.
if ((msg.Msg == WM_VSCROLL) || (msg.Msg == WM_HSCROLL))
{
// Move focus to the ListView to cause ComboBox to lose
focus.
this.Focus();
}

// Pass message to default handler.


base.WndProc(ref msg);
}
}
}

Enregistrez et créez le projet.

éer l'exemple d'application


Suivez ces étapes pour créer une nouvelle application Windows dans Visual C #
.NET:
a. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur Projet .
b. Dans la boîte de dialogue Nouveau projet , cliquez sur Projets Visual C # sous
Types de projets , puis cliquez sur Application Windows sous Modèles . Par
défaut, Form1 est créé.

Suivez ces étapes pour ajouter le contrôle que vous avez créé dans la section
Créer le contrôle ListView hérité à votre application Windows:
https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 3/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

a. Dans le menu Outils , cliquez sur Personnaliser la boîte à outils .


b. Sous l' onglet Composants .NET Framework , cliquez sur Parcourir .
c. Dans la boîte de dialogue Ouvrir , recherchez le contrôle que vous avez créé
dans la section Créer le contrôle ListView hérité , puis cliquez sur Ouvrir . Il
ajoute ce contrôle à la boîte à outils afin que vous puissiez utiliser le contrôle
de la même manière que tout autre contrôle.
d. Faites glisser MyListView de la section Général de la boîte à outils vers Form1.

Faites glisser un contrôle ComboBox de la section Windows Forms de la boîte à


outils vers Form1.

Dans la fenêtre Propriétés de ComboBox, remplacez la propriété Name par


cbListViewCombo , puis définissez la propriété Visible sur False .

Ajoutez le code suivant à la classe Form1 ci-dessus du constructeur:

C# = Copie

private ListViewItem lvItem;

Ajoutez le code suivant à l' Load événement de Form1:

C# = Copie

// Add a few items to the combo box list.


this.cbListViewCombo.Items.Add("NC");
this.cbListViewCombo.Items.Add("WA");

// Set view of ListView to Details.


this.myListView1.View = View.Details;

// Turn on full row select.


this.myListView1.FullRowSelect = true;

// Add data to the ListView.


ColumnHeader columnheader;
ListViewItem listviewitem;

// Create sample ListView data.


listviewitem = new ListViewItem("NC");
listviewitem.SubItems.Add("North Carolina");
this.myListView1.Items.Add(listviewitem);

listviewitem = new ListViewItem("WA");


listviewitem.SubItems.Add("Washington");
this.myListView1.Items.Add(listviewitem);

// Create column headers for the data.


columnheader = new ColumnHeader();
columnheader.Text = "State Abbr.";
this.myListView1.Columns.Add(columnheader);
https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 4/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

columnheader = new ColumnHeader();


columnheader.Text = "State";
this.myListView1.Columns.Add(columnheader);

// Loop through and size each column header to fit the column header
text.
foreach (ColumnHeader ch in this.myListView1.Columns)
{
ch.Width = -2;
}

Ajoutez le code suivant à l' SelectedValueChanged événement de la zone de liste


déroulante:

C# = Copie

// Set text of ListView item to match the ComboBox.


lvItem.Text = this.cbListViewCombo.Text;

// Hide the ComboBox.


this.cbListViewCombo.Visible = false;

Ajoutez le code suivant à l' Leave événement de la zone de liste déroulante:

C# = Copie

// Set text of ListView item to match the ComboBox.


lvItem.Text = this.cbListViewCombo.Text;

// Hide the ComboBox.


this.cbListViewCombo.Visible = false;

Ajoutez le code suivant à l' KeyPress événement de la zone de liste déroulante:

C# = Copie

// Verify that the user presses ESC.


switch (e.KeyChar)
{
case (char)(int)Keys.Escape:
{
// Reset the original text value, and then hide the ComboBox.
this.cbListViewCombo.Text = lvItem.Text;
this.cbListViewCombo.Visible = false;
break;
}

case (char)(int)Keys.Enter:
{
// Hide the ComboBox.
this.cbListViewCombo.Visible = false;
https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 5/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

break;
}
}

Ajoutez le code suivant à l' MouseUp événement de myListView1 :

C# = Copie

// Get the item on the row that is clicked.


lvItem = this.myListView1.GetItemAt(e.X, e.Y);

// Make sure that an item is clicked.


if (lvItem != null)
{
// Get the bounds of the item that is clicked.
Rectangle ClickedItem = lvItem.Bounds;

// Verify that the column is completely scrolled off to the left.


if ((ClickedItem.Left + this.myListView1.Columns[0].Width) < 0)
{
// If the cell is out of view to the left, do nothing.
return;
}

// Verify that the column is partially scrolled off to the left.


else if (ClickedItem.Left < 0)
{
// Determine if column extends beyond right side of ListView.
if ((ClickedItem.Left + this.myListView1.Columns[0].Width) >
this.myListView1.Width)
{
// Set width of column to match width of ListView.
ClickedItem.Width = this.myListView1.Width;
ClickedItem.X = 0;
}
else
{
// Right side of cell is in view.
ClickedItem.Width = this.myListView1.Columns[0].Width +
ClickedItem.Left;
ClickedItem.X = 2;
}
}
else if (this.myListView1.Columns[0].Width >
this.myListView1.Width)
{
ClickedItem.Width = this.myListView1.Width;
}
else
{
ClickedItem.Width = this.myListView1.Columns[0].Width;
ClickedItem.X = 2;
}

// Adjust the top to account for the location of the ListView.


ClickedItem.Y += this.myListView1.Top;
https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 6/7
12/04/2021 Utilisez ComboBox pour modifier les données dans ListView - C # | Microsoft Docs

ClickedItem.X += this.myListView1.Left;

// Assign calculated bounds to the ComboBox.


this.cbListViewCombo.Bounds = ClickedItem;

// Set default text for ComboBox to match the item that is clicked.
this.cbListViewCombo.Text = lvItem.Text;

// Display the ComboBox, and make sure that it is on top with fo-
cus.
this.cbListViewCombo.Visible = true;
this.cbListViewCombo.BringToFront();
this.cbListViewCombo.Focus();
}

rifiez que cela fonctionne


Enregistrez et exécutez l'exemple.

Cliquez sur une ligne dans ListView.

7 Noter

Une zone de liste déroulante apparaît sur l'emplacement de la première


colonne de la ligne actuelle.

Pour masquer la zone de liste déroulante, cliquez sur un élément dans la zone de
liste déroulante, appuyez sur ÉCHAP et puis faites défiler la liste ou cliquez sur un
autre contrôle.

7 Noter

La valeur sur laquelle vous avez cliqué dans la zone de liste déroulante est
placée dans la première colonne de la ligne sur laquelle vous avez cliqué de
ListView.

te page est-elle utile?


Oui  Non

https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/use-combobox-edit-listview 7/7

Vous aimerez peut-être aussi