2011-08-01 230 views
13

我正在處理Windows窗體上的程序我有一個列表框,我正在驗證數據我希望將正確的數據添加到列表框中,顏色爲綠色,同時無效的數據添加了紅色,我也從列表框中自動希望在加入一個項目向下滾動,並感謝C#:更改列表框項目顏色

代碼:

try 
{ 
    validatedata; 
    listBox1.Items.Add("Successfully validated the data : "+validateddata); 
} 
catch() 
{ 
    listBox1.Items.Add("Failed to validate data: " +validateddata); 
} 
+8

你忘了其實*提問*。 – jv42

+0

1.通過你的問題和acceptanswers,看起來你是正確的或有用的。 2)指定問題和技術(WinForms,WPF ...) – Tigran

+0

你忘了提及WinForms/WPF/WebForms/... –

回答

30

假設的WinForms,這是我會做什麼:

開始通過製造類包含的項目添加到列表框中。

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

使用此代碼項目添加到您的列表框:

listBox1.Items.Add(new MyListBoxItem(Colors.Green, "Validated data successfully")); 
listBox1.Items.Add(new MyListBoxItem(Colors.Red, "Failed to validate data")); 

在列表框的屬性,設置DrawMode到OwnerDrawFixed,創造DrawItem事件的事件處理程序。這使您可以根據需要繪製每個項目。

在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 
    } 
} 

有一些限制 - 最主要的是你需要編寫自己的點擊處理和重繪適當的項目,以使它們顯得選擇,自Windows拿下在OwnerDraw模式下不會這樣做。但是,如果這只是爲了記錄應用程序中發生的事情,您可能不關心可選擇的項目。

要滾動到最後一項嘗試

listBox1.TopIndex = listBox1.Items.Count - 1; 
+0

非常感謝爲您的幫助 – BOSS

+4

有更好的方法來實現DrawItem處理程序 - 請參閱http://stackoverflow.com/a/2268234/46635。 – splintor

+4

您忘了添加:'this.listBox1.DrawMode = DrawMode.OwnerDrawFixed;' –

1

不是一個真正的回答你的問題,但是你可能想看看ObjectListView。它是一個ListView而不是一個列表框,但它非常靈活且易於使用。它可以與單個列被用來代表你的數據

我用它來着色每一行

http://objectlistview.sourceforge.net/cs/index.html

這是當然的WinForms的狀態。

+0

非常感謝很多人的幫助 – BOSS

0

如何

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