2012-11-17 114 views
0

我有一個列表框,顯示每行中(X,Y)的某些位置。在列表框中突出顯示多個項目/行

不知何故,用戶可以在文本框中輸入幾個(X,Y)對,然後按下按鈕。

現在我想要做的是:每當用戶輸入3或4(X,Y)對時,我的算法找到匹配的對,並且那些對應的對應該被突出顯示(可以用粉紅色/紅色/任何顏色)同時全部在列表框中。

我怎麼能用我想要的顏色來突出顯示那些對(相同的索引)?


第一版:

作爲NikolaD - Nick引導,我改變DrawMode到OwnerDrawVariable和lsBoxFeature_DrawItem方法,我添加以下代碼:

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(); 
      } 

    } 

項是一個對象,其是一個PointF,現在每當該項目與listBoxFeature中的成員相等時,它應該用紅色突出顯示它們。

這裏有兩個問題:

I)似乎methos .Equals正確犯規中,如果條件檢查工作,如果該項目的PointF在listBoxFeature ===>如圖所示的結果沒什麼等於成員在我listBoxFeature

II),甚至當我運行代碼我得到一個錯誤信息如下:

enter image description here


第2版:

我也跟着NikolaD - Nick建議,它的工作!但有一小片來解決,它不顯示在lsBoxFeature每一行文字(的PointF座標)。

這是現在的樣子:

enter image description here

,這裏是輸出是如何應該是:

enter image description here

我怎麼能走行的TEX早在lsBoxFeature ?

+0

看看這個['link'](http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.hittest.aspx)一次。也許這對你有幫助。 –

+0

@Mr_Green:它是一個列表框,而不是列表視圖 –

+0

oops是的,你是對的..你有解決這個問題的方法嗎? –

回答

3

您應該添加ListViewDrawItem事件處理程序,並在檢查哪些Items應該着色時繪製高亮顯示。事情是這樣的:

 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(); 
     } 

檢查這個問題,有一個更詳細的回答,你可以怎麼做:How do i add same string to a ListBox in some lines?

**編輯:**此編輯爲您編輯您的問題之後。對於所有項目,listBox中的每個項目都不會調用lsBoxFeature_DrawItem事件處理程序。第一個問題是Equals()方法被稱爲對象(ListBox中的Item是對象),它有效地比較了其他對象的引用,而不是PointF的值。第二個問題是您放置了Graphic對象,之後調用了g.Clear()放置在物體上。我已經重寫了你的代碼,我認爲它現在可以工作。

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'行,我編輯它!抱歉。 –

+0

它已經在第一版後開始工作。唯一的問題是:它沒有用來顯示每行的文本[因爲我在我的答案中包含了新編輯(第2版)中的圖像],並且那些預期的行只是用紅色突出顯示,但沒有文本。 但現在我複製g.DrawString行後,即使紅色已經消失,它只是顯示文本(正常,沒有任何突出顯示) –

+0

這必須工作,,你確定你只複製這行'g。 DrawString(lsBoxFeature.Items [e.Index] .ToString(),lsBoxFeature.Font,新的SolidBrush(lsBoxFeature.ForeColor),新的Rectangle(e.Bounds.X,0,e.Bounds.Width,e.Bounds.Height) );' –

相關問題