2014-12-16 2 views
0

Когда у меня запущено событие DrawItem моего списка. Я хотел бы перебирать элементы и если текст каждого элемента соответствует определенному условию, тогда их цвет фона будет зеленым, а если нет, то он будет желтым.Все элементы списка, цветные, а не один за другим

Со следующим кодом, я получаю все свои предметы одного цвета. Я не очень хорошо программирую графику в C Sharp Я думаю.

private void listBoxYourSelection_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    ListBox lst = (ListBox)sender; 

    foreach(string item in lst.Items) 
    {     
     Color col = new Color(); 
     e.DrawBackground(); 
     e.DrawFocusRectangle(); 
     if (CONDITIONISTRUE) 
      col = Color.Green; 
     else 
      col = Color.Yellow; 
     e.Graphics.DrawRectangle(new Pen(col), e.Bounds); 
     e.Graphics.FillRectangle(new SolidBrush(col), e.Bounds); 
     if (e.Index >= 0) 
     { 
      e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), e.Bounds, StringFormat.GenericDefault); 
     } 
    } 
} 
+2

Я думаю, что ваш «CONDITIONISTRUE» всегда истинный или ложный – Vajura

+0

не зная, что «КОНДИЦИОНЕР» - это невозможно помочь, кажется, никогда не бывает t в любом месте, и если это деталь реализации, тогда вам нужно будет поделиться этим тоже – Sayse

+0

@ Vajura Я просто сделал чек, и я понял, что условие иногда является ложным и истинным. Но я думаю, что тот факт, что я повторяю свой «список» каждый раз, когда добавляется элемент, вводит в заблуждение метод. Поэтому мой вопрос заключается не в 'ListBox lst = (ListBox) отправителя, а в том, как я могу только захватить элемент, который был добавлен? – Disasterkid

ответ

2

Ошибка действительно перебирать элементы в ListBox.

Вам не нужно заботиться о других Item, так как метод DrawItem делает это уже для вас! Она будет называться отдельно для каждого пункта в вашем ListBox, когда система думает, что это необходимо ..

Все, что вам нужно позаботиться о том, выбирая правильный Color, Font, Text т.д., для одногоItem вы рисуете в текущем вызов.

Вы можете определить, какой предмет окрашивается, просмотрев параметр e.Index.

Немного измененная версия может выглядеть следующим образом:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
     // for testing I turn on every other item; 
     // you will want to use another way to decide..!! 
     bool CONDITIONISTRUE = e.Index % 2 == 0; 

     bool selected = listBox1.SelectedIndex == e.Index; 

     Color col = new Color(); 
     if (CONDITIONISTRUE) 
      col = selected ? SystemColors.HotTrack : Color.PaleGreen; 
     else 
      col = selected ? SystemColors.HotTrack : Color.Gold; 

     e.DrawBackground();   // not really needed 
     e.DrawFocusRectangle();  // not really needed either 

     using (Pen pen = new Pen(col)) 
     using (SolidBrush brush = new SolidBrush(col)) 
     { 
      e.Graphics.DrawRectangle(new Pen(col), e.Bounds); 
      e.Graphics.FillRectangle(new SolidBrush(col), e.Bounds); 
     } 
     if (e.Index >= 0) 
     { 
      e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), 
         e.Font, selected? Brushes.White:Brushes.Black, 
         e.Bounds, StringFormat.GenericDefault);   } 
    } 
} 

Очевидно, что CONDITIONISTRUE должен быть установлен каким-либо другим образом в вас код! Если это метод, вы можете включить индекс товара в качестве параметра.

Примечание 1: Поскольку ваш чертеж полностью заполняет каждый элемент, выбранный элемент больше не может быть распознан. Я решить эту проблему, выбирая между большим количеством цветов: Вместо обычного SystemColors.HotTrack с белым текстом вы могли бы вы могли использовать любые другие цветы вы любите, в course..or просто жирный шрифт ..

Примечание 2: С ListBox пытается «оптимизирует» сам по себе, не всегда рисунок каждый товара нам нужно, чтобы заставить его, добавив это:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    listBox1.Invalidate(); 
} 
Смежные вопросы