2017-10-18 17 views
0

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?

+0

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

+0

Merci @Bagerfahrer C'est la chose que j'ai raté. – Flavius

Répondre

2

sender est le contrôle qui a déclenché l'événement que vous gérez. Lorsque vous avez créé le gestionnaire dans la grille Propriétés, quel était le contrôle sélectionné? Le ListBox. Donc, c'est le contrôle qui déclenche l'événement. En général, collez un point d'arrêt dans la méthode du gestionnaire et examinez les paramètres à l'exécution lorsque l'événement est déclenché. C'est toujours un moyen rapide de se repérer avec ces choses.

+1

Merci @Ed Je ne sais pas pourquoi je n'ai pas regardé dans l'expéditeur ... J'ai vu sa valeur affichée dans Watch is {SelectedItem = ""} et je ne pensais pas avoir l'air fou. – Flavius