Ошибка действительно перебирать элементы в 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();
}
Я думаю, что ваш «CONDITIONISTRUE» всегда истинный или ложный – Vajura
не зная, что «КОНДИЦИОНЕР» - это невозможно помочь, кажется, никогда не бывает t в любом месте, и если это деталь реализации, тогда вам нужно будет поделиться этим тоже – Sayse
@ Vajura Я просто сделал чек, и я понял, что условие иногда является ложным и истинным. Но я думаю, что тот факт, что я повторяю свой «список» каждый раз, когда добавляется элемент, вводит в заблуждение метод. Поэтому мой вопрос заключается не в 'ListBox lst = (ListBox) отправителя, а в том, как я могу только захватить элемент, который был добавлен? – Disasterkid