2010-03-31 44 views
29

Tôi đang cố gắng thay đổi màu nền của một số hàng trong một ListBox. Tôi có hai danh sách có một danh sách và được hiển thị trong một số ListBox. Danh sách thứ hai có một số giá trị tương tự như List đầu tiên. Khi nhấp vào nút, tôi muốn tìm kiếm ListBox và số List thứ hai và thay đổi màu của ListBox cho các giá trị đó xuất hiện trong List. tìm kiếm của tôi trong ListBox là như sau:C#: thay đổi màu hàng của hộp danh sách?

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

Nhưng tôi không biết đó là phương pháp sử dụng để thay đổi sự xuất hiện của một hàng ListBox. Ai có thể giúp tôi?

** EDIT: **

HI tôi đã viết mã của tôi như sau:

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

Bây giờ nó thu hút tôi List trong ListBox, nhưng khi tôi nhấp vào nút đầu tiên, nó cho thấy màu đỏ chỉ những sinh viên đang ở trong số List và khi tôi nhấp vào ListBox, nó thu hút tất cả các yếu tố. Tôi muốn nó sẽ hiển thị tất cả các yếu tố và khi tôi nhấp vào nút, nó sẽ hiển thị tất cả các phần tử và phần tử được tìm thấy trong màu List màu đỏ. Sai lầm của tôi đâu rồi?

+1

Vẽ tự mình sử dụng OwnerDraw: http://www.c-sharpcorner.com/UploadFile/sahuja/OwnerDrawListBox11212005014826AM/OwnerDrawListBox.aspx –

+1

trùng lặp có thể xảy ra http://stackoverflow.com/questions/1243870/changing- chọn-itms-color-in-a-listbox –

+0

Sau khi cập nhật của bạn: dường như bạn không nhận được những gì người trả lời trước đây dưới đây cho bạn thấy. Phương thức DrawItem _ rút một item_, không phải nhiều mục. Bạn sẽ cần phải xử lý _each mục khi cần thiết, và ** không ** sử dụng một vòng lặp for để xử lý các mục _all_. Hãy xem câu trả lời của Thomas Levesque hoặc Justin cho những ví dụ hay. –

Trả lời

20

Tôi tìm giải pháp thay vì sử dụng ListBox tôi đã sử dụng ListView.It cho phép thay đổi các mục danh sách 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

Tôi nghĩ bạn phải tự mình vẽ danh sách để đạt được điều này.

Here's a post với cùng một loại câu hỏi.

20

Bạn sẽ cần tự vẽ mục đó. Thay đổi DrawMode thành OwnerDrawFixed và xử lý sự kiện 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

cảm ơn nhận xét nhưng làm cách nào tôi sử dụng chức năng này? hoặc ở đâu? Tôi đã thay đổi trong thuộc tính của listbox để Drawmode = OwnerDrawFixed và trong InitializeComponent() tôi có phải sửa một số suy nghĩ? hoặc đơn giản là tôi sẽ thêm hàm này vào hàm Form1.cs và nó sẽ gọi nó? – Ercan

+1

Tôi là một người hâm mộ thiết kế VS. Vì vậy, trong trình soạn thảo biểu mẫu, trong đó hộp danh sách của bạn đi vào danh sách sự kiện và tạo một trình xử lý mới cho sự kiện DrawItem. Sau đó sử dụng mã trên trong trình xử lý sự kiện mới của bạn. – Justin

+0

Để sử dụng trình xử lý mục vẽ: listBox1.DrawMode = DrawMode.OwnerDrawFixed; listBox1.DrawItem + = new DrawItemEventHandler (listBox1_DrawItem); – Harrichael

11

đầu tiên sử dụng Namespace này:

using System.Drawing; 

Thêm bất cứ nơi nào trên hình của bạn:

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

Đây là Handler Sự kiện:

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

Làm thế nào về

 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

Rõ ràng là bạn chưa bao giờ thử mã đó. Nó không hoạt động. Nó thậm chí không biên dịch. Có vẻ như bạn là một lập trình viên Java. Trong Java nó được thực hiện theo cách này. Nhưng C# hoàn toàn khác nhau. – Elmue

+0

Tại sao bạn mong đợi nó biên dịch? đó là mã meta. Vâng, tôi đã thiết kế & viết mã trong khoảng 50 năm chỉ :) Rõ ràng là tôi sẽ không thuê bạn nếu tất cả những gì bạn có thể làm là tìm các câu trả lời sao chép/dán. –

+2

Mã này hoàn toàn crap. Bạn không thể đặt nhãn vào hộp danh sách. Nó cho thấy rằng bạn đã không học lập trình C#, thậm chí không trong vòng 50 năm. – Elmue

Các vấn đề liên quan