C# - Comboxbox dans cellule Listview en mode détails, possible ?
Bonjour à tous,
Ne trouvant pas mon bonheur, je fais appel à vous.
J'aimerais, dans un listview à 2 colonnes (en mode détail), mettre une combobox dans certaines cellules de la colonne 2, mais pas dans toutes.
J'aurais voulu savoir si quelqu'un aurait une petit astuce à me donner ou bien me dire s'il est possible de "re"créer le contrôle listview en y ajoutant le fait qu'une cellule peut comporter un autre controle de type combobox ?
Pour info, le but final est de lister toutes les propriétés et valeurs d'un compte Active Directory.
Et comme certaines propriétés comportent plusieurs valeurs, vous aurez compris que j'aurais aimé les lister dans une combobox.
Merci pour votre aide :D
combobox dans un listview,combobox intrus et fantome
bonjour hellspawn_ludo
Voici comment:c'est un ComboBox si j'ose dire fantome et intrus puisque c'est un ComboBox droppe simplement sur le controle Winform et rendu invisible à l'execution.
Ensuite il est reaffiche par dessus une colonne du controle personnalise myListview.
code du controle personnalise MyListView:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
//controle personnalise MyListView
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ListViewHerite
{
public partial class MyListView : ListView
{
public MyListView()
{
// Cet appel est nécessaire au Concepteur de formulaire Windows.Forms.
InitializeComponent();
// TODO : // Ajoute toute initialisation exécutée après lappel InitForm
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
protected override void WndProc(ref Message msg)
{
// Recherche le message WM_VSCROLL ou WM_HSCROLL.
if ((msg.Msg == WM_VSCROLL) || (msg.Msg == WM_HSCROLL))
{
// Déplace le focus de ListView de sorte que ComboBox le perde.
this.Focus();
}
// Transmet le message au gestionnaire par défaut.
base.WndProc(ref msg);
}
}
} |
code du winform test :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
//code winform de test
//1-dropper un controle listview .
//renommer-le en myListView1.
//2-dropper un controle combobox n'importe ou.
//renommer-le cbListViewCombo et rendez-le invisible.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ListViewHerite
{
public partial class frmTest : Form
{
private ListViewItem lvItem;
public frmTest()
{
InitializeComponent();
this.cbListViewCombo.Visible = false;
}
//Ajoutez le code suivant à l'événement Load de Form1 :
private void frmTest_Load(object sender, EventArgs e)
{
// Ajoute des éléments à la zone de liste déroulante.
this.cbListViewCombo.Items.Add("NC");
this.cbListViewCombo.Items.Add("WA");
// Définit l'affichage de ListView sur Détails.
this.myListView1.View = View.Details;
// Active la sélection de ligne complète.
this.myListView1.FullRowSelect = true;
// Ajoute des données à ListView.
ColumnHeader columnheader;
ListViewItem listviewitem;
// Crée les données d'exemple ListView.
listviewitem = new ListViewItem("NC");
listviewitem.SubItems.Add("Caroline du Nord");
this.myListView1.Items.Add(listviewitem);
listviewitem = new ListViewItem("WA");
listviewitem.SubItems.Add("Washington");
this.myListView1.Items.Add(listviewitem);
// Crée des en-têtes de colonne pour les données.
columnheader = new ColumnHeader();
columnheader.Text = "Abr. Pays";
this.myListView1.Columns.Add(columnheader);
columnheader = new ColumnHeader();
columnheader.Text = "État";
this.myListView1.Columns.Add(columnheader);
// Recherche et dimensionne chaque en-tête de colonne afin qu'il s'adapte au texte d'en-tête.
foreach (ColumnHeader ch in this.myListView1.Columns)
{
ch.Width = -2;
}
}
//Ajoutez le code suivant à l'événement SelectedValueChanged de la zone de liste déroulante :
private void cbListViewCombo_SelectedValueChanged(object sender, EventArgs e)
{
// Définit le texte de l'élément ListView pour qu'il corresponde à la zone de liste déroulante.
lvItem.Text = this.cbListViewCombo.Text;
// Masque la zone de liste déroulante.
this.cbListViewCombo.Visible = false;
}
//Ajoutez le code suivant à l'événement Leave de la zone de liste déroulante :
private void cbListViewCombo_Leave(object sender, EventArgs e)
{
// Définit le texte de l'élément ListView pour qu'il corresponde à la zone de liste déroulante.
lvItem.Text = this.cbListViewCombo.Text;
// Masque la zone de liste déroulante.
this.cbListViewCombo.Visible = false;
}
//Ajoutez le code suivant à l'événement KeyPress de la zone de liste déroulante
private void cbListViewCombo_KeyPress(object sender, KeyPressEventArgs e)
{
// Vérifie que l'utilisateur appuie sur Echap.
switch (e.KeyChar)
{
case (char)(int)Keys.Escape:
{
// Réinitialise la valeur de texte originale, puis masque la zone de liste déroulante.
this.cbListViewCombo.Text = lvItem.Text;
this.cbListViewCombo.Visible = false;
break;
}
case (char)(int)Keys.Enter:
{
// Masque la zone de liste déroulante.
this.cbListViewCombo.Visible = false;
break;
}
}
}
//Ajoutez le code suivant à l'événement MouseUp de myListView1 :
private void myListView1_MouseUp(object sender, MouseEventArgs e)
{
// Obtient l'élément sur la ligne sélectionnée.
lvItem = this.myListView1.GetItemAt(e.X, e.Y);
// Vérifie que l'utilisateur a cliqué sur un élément.
if (lvItem != null)
{
// Obtient les limites de l'élément sélectionné.
Rectangle ClickedItem = lvItem.Bounds;
// Vérifie que la colonne commence complètement à gauche.
if ((ClickedItem.Left + this.myListView1.Columns[0].Width) < 0)
{
// Si la cellule n'est pas visible à gauche, aucune action.
return;
}
// Vérifie que la colonne commence partiellement à gauche.
else if (ClickedItem.Left < 0)
{
// Détermine si une colonne s'étend au-delà de la limite droite de ListView.
if ((ClickedItem.Left + this.myListView1.Columns[0].Width) > this.myListView1.Width)
{
// Définit la largeur de la colonne pour correspondre à la largeur de ListView.
ClickedItem.Width = this.myListView1.Width;
ClickedItem.X = 0;
}
else
{
// Le côté droit de la cellule est visible.
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;
}
// Ajuste le sommet en fonction de la position de ListView.
ClickedItem.Y += this.myListView1.Top;
ClickedItem.X += this.myListView1.Left;
// Attribue des limites calculées à la zone de liste déroulante.
this.cbListViewCombo.Bounds = ClickedItem;
// Définit le texte par défaut de la zone de liste déroulante de sorte à correspondre à l'élément sélectionné.
this.cbListViewCombo.Text = lvItem.Text;
// Affiche la zone de liste déroulante et vérifie qu'elle est en haut avec focus.
this.cbListViewCombo.Visible = true;
this.cbListViewCombo.BringToFront();
this.cbListViewCombo.Focus();
}
}
}
} |
:
lien msdn du code ci-dessus:
http://www.google.fr/url?sa=t&source...H0-Mvsq7U82ciw
Titre du lien google:
How to use a ComboBox control to edit data in a ListView control .
bon code..................