2012-11-17 5 views
0

J'ai une zone de liste qui affiche des positions de (X, Y) dans chaque ligne.Mettez en surbrillance plusieurs éléments/lignes dans listBox

D'une certaine manière, l'utilisateur peut entrer quelques paires (X, Y) dans une zone de texte et appuyer sur le bouton. Maintenant, ce que je veux faire est: chaque fois que l'utilisateur a entré 3 ou 4 paires (X, Y), mon algorithme trouve les paires appariées et les paires correspondantes doivent être mises en évidence (disons avec rose/rouge/n'importe quelle couleur) en même temps tous ensemble dans la zone de liste.

Comment est-ce que je pourrais mettre en évidence ces paires (mêmes index) avec mes couleurs désirées?


1ère édition:

Comme NikolaD - Nick guidé, je changé ma DrawMode à OwnerDrawVariable et méthode lsBoxFeature_DrawItem, j'ai ajouté le code suivant:

private void lsBoxFeature_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     e.DrawFocusRectangle(); 
     Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height); 
     Graphics g = Graphics.FromImage(bmp); 


      foreach (var item in globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber) 
      { 
       if (lsBoxFeature.Items[e.Index].Equals(item))//your method that determines should current item be highlighted 
       { 
        g.Clear(Color.Red); 
       } 
       else 
       { 
        g.Clear(lsBoxFeature.BackColor); 
       } 

       g.DrawString(lsBoxFeature.Items[e.Index].ToString(), lsBoxFeature.Font, new SolidBrush(lsBoxFeature.ForeColor), e.Bounds); 
       e.Graphics.DrawImage(bmp, e.Bounds); 
       g.Dispose(); 
      } 

    } 

élément est un objet qui est PointF, maintenant chaque fois que l'élément est égal à ces membres dans listBoxFeature, il devrait les mettre en évidence en rouge.

Il y a deux questions:

I), il semble Methos Equals doesnt fonctionnent correctement si condition pour vérifier si l'élément de PointF est égal aux membres listBoxFeature ===> En tant que rien de résultat est présenté dans mon listBoxFeature

II) Même quand je lance le code que je reçois un message d'erreur suivant:

enter image description here


2e édition:

je suivais NikolaD - Nick des conseils, et cela a fonctionné !!! Mais il y a un petit morceau à résoudre, il ne montre pas le texte (PointF coordonnées) pour chaque ligne de lsBoxFeature..

Voici à quoi il ressemble maintenant:

enter image description here

et voici comment la sortie est censé être:

enter image description here

Comment pourrais-je reprendre la tex de la ligne dans lsBoxFeature ?

+0

Jetez un oeil à ce [ 'link'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.hittest.aspx) une fois. Peut-être que cela vous est utile. –

+0

@Mr_Green: C'est une boîte de liste, pas une vue de liste –

+0

oups oui vous avez raison .. avez-vous eu la solution pour ce problème? –

Répondre

3

Vous devez ajouter le gestionnaire d'événements DrawItem de ListView et dessiner la surbrillance en vérifiant lequel Items doit être coloré. Quelque chose comme ceci:

 private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
       e.DrawFocusRectangle(); 
       Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height); 
       Graphics g = Graphics.FromImage(bmp); 

       if (MeetsCriterion(listBox1.Items[e.Index]))//your method that determines should current item be highlighted 
       { 
        g.Clear(Color.Red); 
       } 
       else 
       { 
        g.Clear(listBox1.BackColor); 
       } 
       g.DrawString(listBox1.Items[e.Index].ToString() , listBox1.Font, new SolidBrush(listBox1.ForeColor), e.Bounds); 
       e.Graphics.DrawImage(bmp, e.Bounds); 
       g.Dispose(); 
     } 

Cocher cette question, il y a une réponse plus détaillée comment vous pouvez le faire: How do i add same string to a ListBox in some lines?

** EDIT: ** Cette édition est une fois que vous avez modifié votre question. Le gestionnaire d'événements lsBoxFeature_DrawItem est appelé pour chaque élément dans listBox, pas une fois pour tous les éléments.Le premier problème était que la méthode Equals() est appelée pour object (Item dans ListBox is object) comparant effectivement la référence d'un autre objet, pas la valeur de PointF. Le deuxième problème était que vous avez éliminé l'objet Graphic et ensuite g.Clear() sur l'objet disposé. J'ai réécrit ton code et je pense que ça va marcher maintenant.

private void lsBoxFeature_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      e.DrawFocusRectangle(); 
      Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height); 
      Graphics g = Graphics.FromImage(bmp); 

      bool found = false; 
      int count = 0; 
      PointF pF1 = (PointF)lsBoxFeature.Items[e.Index]; 
      while (!found && count < globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber.Count) 
      { 
       //next two lines are here to show you the problem with equals!!!! 

       PointF pF2 = (PointF)globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber[count]; 
       if(pF1.Equals(pF2)) 
       { 
        found = true; 
       } 
       count++; 
      } 

      if (found)//your method that determines should current item be highlighted 
      { 
       g.Clear(Color.Red); 
      } 
      else 
      { 
       g.Clear(lsBoxFeature.BackColor); 
      } 
      g.DrawString(lsBoxFeature.Items[e.Index].ToString(), lsBoxFeature.Font, new SolidBrush(lsBoxFeature.ForeColor), new Rectangle(e.Bounds.X,0,e.Bounds.Width,e.Bounds.Height)); 
      e.Graphics.DrawImage(bmp, e.Bounds); 
      g.Dispose(); 

     } 
+0

g.DrawString' ligne, je l'ai édité! Pardon. –

+0

Il avait commencé à travailler après votre première édition. le seul problème était: Il n'a pas utilisé pour afficher le texte de chaque ligne [car j'ai inclus les images dans la nouvelle édition (2ème édition) dans ma réponse] et ces lignes attendues étaient juste en surbrillance avec Red mais aucun texte. mais maintenant après avoir copié à nouveau la ligne g.DrawString, même les couleurs rouges sont allées et il montre juste les textes (comme normal sans aucun surlignage) –

+0

Cela doit fonctionner,, êtes-vous sûr que vous avez copié seulement cette ligne 'g. DrawString (lsBoxFeature.Items [e.Index] .ToString(), lsBoxFeature.Font, nouveau SolidBrush (lsBoxFeature.ForeColor), nouveau Rectangle (e.Bounds.X, 0, e.Bounds.Width, e.Bounds.Height)); ' –

Questions connexes