Je crée un TabControl qui contient sur chacune de ses TabPage créées dynamiquement un ListBox créé dynamiquement, chacune avec un contenu différent. Pour chaque ListBox, je veux gérer le texte qui s'y trouve (en changeant sa couleur en fonction d'un état qui n'est pas visible dans le code affiché).Zones de liste dynamiques avec événement DrawItem pour chacune d'entre elles
Au moment où je colorie le texte pour un ListBox spécifique en utilisant une classe qui contient la couleur du texte et le message qui sera utilisé pour une ligne.
Exemple avec le code utilisé pour le ListBox créé manuellement:
private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
{
return;
}
ListBoxLogsItem item = listBoxLogs.Items[e.Index] as ListBoxLogsItem;
if (item != null)
{
e.DrawBackground();
e.Graphics.DrawString(item.m_message, listBoxLogs.Font, item.m_color, e.Bounds, System.Drawing.StringFormat.GenericDefault);
System.Drawing.Graphics g = listBoxLogs.CreateGraphics();
System.Drawing.SizeF s = g.MeasureString(item.m_message, listBoxLogs.Font);
if (s.Width > listBoxLogs.HorizontalExtent)
{
listBoxLogs.HorizontalExtent = (int)s.Width + 2;
}
}
}
Le code suivant est utilisé pour créer TabPage et ListBox:
// _tagName is an identifier used to know the TabPage and ListBox in which the text will be added
private void AddTabPage(string _tagName)
{
ListBox listBox = new ListBox();
listBox.Text = _tagName;
listBox.Name = _tagName;
listBox.Location = new System.Drawing.Point(6, 6);
listBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
listBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBoxLogs_DrawItem);
listBox.Size = new System.Drawing.Size(628, 378);
listBox.FormattingEnabled = true;
listBox.HorizontalScrollbar = true;
listBox.ItemHeight = 17;
listBox.TabIndex = 15;
// TODO: Remove this line. Added just for testing
listBox.Items.Add(new ListBoxLogsItem(System.Drawing.Brushes.Black, ""));
TabPage tab = new TabPage();
tab.Name = _tagName;
tab.Controls.Add(listBox);
// Add the TabPage to the TabControl only when it's available
ExecuteOnControlThread(delegate
{
tabControl.Controls.Add(tab);
});
}
Je ne peux pas comprendre comment identifier le ListBox qui appelle le DrawItemEventHandler "this.listBoxLogs_DrawItem".
Quelqu'un peut-il me dire comment je peux faire cela, ou d'une manière différente qui me permettra d'obtenir le même résultat?
Je ne suis pas sûr de ce que vous demandez, mais vous pouvez les identifier par référence ou définir ListBox.Name. Pouvez-vous dire de quelle manière vous voulez les identifier? le paramètre passé 'expéditeur' est votre ListBox. Juste le cast à ListBox à la 'var anyListBox = (ListBox) expéditeur;' – Bagerfahrer
Merci @Bagerfahrer C'est la chose que j'ai raté. – Flavius