2010-03-31 6 views
29

J'essaie de changer la couleur d'arrière-plan de certaines lignes dans un ListBox. J'ai deux listes que l'on a des noms et est affiché dans un ListBox. La deuxième liste a des valeurs similaires à la première List. Lorsque vous cliquez sur un bouton, je veux rechercher le ListBox et le second List, et changer la couleur du ListBox pour les valeurs qui apparaissent dans le List. Ma recherche dans le ListBox est la suivante:C#: modification de la couleur de la ligne de liste?

for (int i = 0; i < listBox1.Items.Count; i++) 
{ 
    for (int j = 0; j < students.Count; j++) 
    { 
     if (listBox1.Items[i].ToString().Contains(students[j].ToString())) 
     { 
     } 
    } 
} 

Mais je ne sais pas quelle méthode utiliser afin de modifier l'apparence d'une ligne ListBox. Quelqu'un peut-il m'aider?

** EDIT: **

HI j'ai écrit mon code comme suit:

private void ListBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 
    Brush myBrush = Brushes.Black; 
    Brush myBrush2 = Brushes.Red; 
    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds); 
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault); 
    for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listBox1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       e.Graphics.DrawString(listBox1.Items[i].ToString(), 
       e.Font, myBrush2, e.Bounds, StringFormat.GenericDefault); 
      } 
     } 
    } 
    e.DrawFocusRectangle(); 
} 

Maintenant, il tire mon List dans le ListBox, mais quand je clique sur le bouton d'abord, il montre en rouge seulement les étudiants qui sont dans le List et quand je clique sur le ListBox il dessine tous les éléments. Je veux qu'il montre tous les éléments, et quand je clique sur le bouton il montrera tous les éléments et l'élément trouvé dans le List en rouge. Où est mon erreur?

+1

Dessinez vous-même en utilisant OwnerDraw: http://www.c-sharpcorner.com/UploadFile/sahuja/OwnerDrawListBox11212005014826AM/OwnerDrawListBox.aspx –

+1

double possible de http://stackoverflow.com/questions/1243870/changing- selected-itms-color-in-a-listbox –

+0

Après votre mise à jour: apparemment, vous n'obtenez pas ce que les réponses précédentes vous ont montré. La méthode DrawItem _ retire un item_, pas plusieurs éléments. Vous aurez besoin de gérer l'élément _each au besoin, et ** pas ** d'utiliser une boucle for pour traiter tous les éléments. Jetez un oeil à la réponse de Thomas Levesque ou Justin pour de bons exemples. –

Répondre

20

je trouve une solution qu'au lieu d'utiliser ListBox je ListView.It permet de modifier les éléments de liste BackColor.

private void listView1_Refresh() 
{ 
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
     listView1.Items[i].BackColor = Color.Red; 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listView1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       listView1.Items[i].BackColor = Color.Green; 
      } 
     } 
    } 
} 
2

Je pense que vous devez dessiner les listitems vous-même pour y parvenir.

Here's a post avec le même genre de question.

20

Vous devrez dessiner l'article vous-même. Changez le DrawMode à OwnerDrawFixed et gérez l'événement DrawItem.

/// <summary> 
/// Handles the DrawItem event of the listBox1 control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Windows.Forms.DrawItemEventArgs"/> instance containing the event data.</param> 
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 

    // draw the background color you want 
    // mine is set to olive, change it to whatever you want 
    g.FillRectangle(new SolidBrush(Color.Olive), e.Bounds); 

    // draw the text of the list item, not doing this will only show 
    // the background color 
    // you will need to get the text of item to display 
    g.DrawString(THE_LIST_ITEM_TEXT , e.Font, new SolidBrush(e.ForeColor), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
+0

merci pour le commentaire mais comment vais-je utiliser cette fonction? ou où? J'ai changé dans les propriétés de listbox à Drawmode = OwnerDrawFixed et dans InitializeComponent() suis-je obligé de corriger certains think? ou simplement je vais ajouter cette fonction à ma fonction Form1.cs et l'appellera? – Ercan

+1

Je suis un fan de designer VS. Ainsi, dans l'éditeur de formulaire, votre liste est placée dans la liste des événements et crée un nouveau gestionnaire pour l'événement DrawItem. Utilisez ensuite le code ci-dessus dans votre nouveau gestionnaire d'événements. – Justin

+0

Pour utiliser le gestionnaire d'élément de dessin: listBox1.DrawMode = DrawMode.OwnerDrawFixed; listBox1.DrawItem + = new DrawItemEventHandler (listBox1_DrawItem); – Harrichael

11

Première utilisation de cette Namespace:

using System.Drawing; 

Ajouter ce n'importe où sur votre formulaire:

listBox.DrawMode = DrawMode.OwnerDrawFixed; 
listBox.DrawItem += listBox_DrawItem; 

Voici le gestionnaire de l'événement:

private void listBox_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 

    Graphics g = e.Graphics; 
    g.FillRectangle(new SolidBrush(Color.White), e.Bounds); 
    ListBox lb = (ListBox)sender; 
    g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
-2

Que diriez-vous

 MyLB is a listbox 

     Label ll = new Label(); 
     ll.Width = MyLB.Width; 
     ll.Content = ss; 
     if(///<some condition>///) 
      ll.Background = Brushes.LightGreen; 
     else 
      ll.Background = Brushes.LightPink; 
     MyLB.Items.Add(ll); 
+2

Il est évident que vous n'avez jamais essayé ce code. Ça ne marche pas. Il ne compile même pas. Il semble que vous êtes un programmeur Java. En Java, c'est fait de cette façon. Mais C# est complètement différent. – Elmue

+0

Pourquoi vous attendiez-vous à ce qu'il compile? c'est le code méta. Eh bien, j'ai été la conception et l'écriture de code pour environ 50 ans seulement :) Évidemment, je ne vous engagerais pas si tout ce que vous pouvez faire est de chercher copier/coller des réponses. –

+2

Ce code est une merde complète. Vous ne pouvez pas mettre une étiquette dans une liste. Cela montre que vous n'avez pas appris la programmation C#, pas même dans les 50 ans. – Elmue

Questions connexes