2012-10-13 219 views
1

我想這個代碼,但它不工作:我如何爲ListBox中特定項目中的特定文本添加顏色?

private void LoadKeys(Dictionary<string,List<string>> dictionary, string FileName) 
     { 

       string line = System.String.Empty; 
       using (StreamReader sr = new StreamReader(keywords)) 
       { 
        while ((line = sr.ReadLine()) != null) 
        { 
         string[] tokens = line.Split(','); 
         dictionary.Add(tokens[0], tokens.Skip(1).ToList()); 
         listBox1.Items.Add(new MyListBoxItem(Color.Green, "Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1])); 
        } 
       } 

     } 

現在類MyListBoxItem:

public class MyListBoxItem 
     { 
      public MyListBoxItem(Color c, string m) 
      { 
       ItemColor = c; Message = m; 
      } 
      public Color ItemColor 
      { 
       get; 
       set; 
      } 
      public string Message 
      { 
       get; 
       set; 
      } 
     } 

而且listBox1_DrawItem事件:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      MyListBoxItem item = listBox1.Items[e.Index] as MyListBoxItem; 
      // Get the current item and cast it to MyListBoxItem 
      if (item != null) 
      { 
       e.Graphics.DrawString(// Draw the appropriate text in the ListBox 
        item.Message, // The message linked to the item 
        listBox1.Font, // Take the font from the listbox 
        new SolidBrush(item.ItemColor), // Set the color 
        0, // X pixel coordinate 
        e.Index * listBox1.ItemHeight // Y pixel coordinate. Multiply the index by the ItemHeight defined in the listbox. 
       ); 
      } 
      else 
      { 
       // The item isn't a MyListBoxItem, do something about it 
      } 
     } 

在列表框與嘗試此之前,顏色和繪製項目我用這條線:

listBox1.Items.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]); 

的結果,例如:網址:http://www.google.com --- Localy關鍵字:

:試圖顏色故在綠色這條線的顏色仍然是黑色,ListBox中的文字現在是當谷歌

現在

GatherLinks.Form1 + MyListBoxItem奇怪。

我想要做的是在列表框中的第一行着色Url:在紅色---在藍色和localykeyword:在黃色 在第二行Url:in Green ---在紅色和價值例如谷歌在藍色。

我該怎麼辦?

+0

切換到具有ViewMode = Details的ListView將允許您爲列表中的每個項目指定前景色和背景色。讓我知道如果這是可以接受的,我會在一個答案中改變這個評論。 – Steve

回答

0

我正在做我的一個項目。按交鑰匙上面我有臺詞:

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

在我的表單的初始化代碼。 DrawItem的代碼處理類似於選擇顏色的東西

private void listBox_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index == -1) 
      { 
       return; 
      } 

      e.DrawBackground(); 
      Graphics g = e.Graphics; 

      var selected = (e.State & DrawItemState.Selected) == DrawItemState.Selected; 
      var lb = (ListBox)sender; 

      if (selected) 
      { 
       g.FillRectangle(new SolidBrush(Color.DarkBlue), e.Bounds); 
       g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.White), new PointF(e.Bounds.X, e.Bounds.Y)); 
       return; 
      } 

      var item = (ProjectToDoRecord)lb.Items[e.Index]; 
      var textColor = item.TrafficLight(); 
      g.FillRectangle(new SolidBrush(Color.White), e.Bounds); 
      g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(textColor), new PointF(e.Bounds.X, e.Bounds.Y)); 
     } 

繪製的每個項目的顏色由textColor決定。這被設置爲正在繪製的項目中定義的顏色。

+0

Scruffyduck以及如何在代碼中使用它來爲每行中不同顏色的特定文本部分着色?請給我一個例子。 –

+0

我從來沒有試過這樣做。 – ScruffyDuck

0

您是否更改列表框的DrawMode屬性以允許所有者繪圖?

listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
+0

交鑰匙工作,但其繪畫整行/ s,而不是選定的文本。例如,如果我將行更改爲:listBox1.Items.Add(new MyListBoxItem(Color.Red,「Url:」));它會用Url將所有行顏色變爲紅色。這不是我想要的。我想用另一種顏色對一行進行着色,對每行另一種顏色的文本的每一部分進行着色。 –

+0

我認爲這是ListBox控件本身按項目繪製的限制。 – Turnkey

相關問題