Изменение ListViewItem.ForeColor не отображается
РЕДАКТИРОВАТЬ: я кукла
Итак... получается, что проблема в следующей строке;
item.UseItemStyleForSubItems = false;
Я скопировал эту строку из другого фрагмента кода, где я просто пытался изменить один SubItem
Затем я передумал и решил, что здесь я хочу изменить весь ряд. мой listView
имеет пару скрытых столбцов, и когда UseItemStyleForSubItems
установлен в false
меняет только первое SubItem
, Таким образом, изменения, вероятно, происходили все время, но не по всему ряду.
Вот что grayOut
выглядит сейчас:
internal static void grayOut(ref ListView myLV)
{
//change each selected item to gray text
//currently, multiselect is turned off, so this will only be one item at a time
foreach (ListViewItem item in myLV.SelectedItems)
{
item.Selected = false;
item.ForeColor = Color.Gray;
item.BackColor = Color.Gainsboro;
item.Font = new Font("MS Sans Serif", 8, FontStyle.Italic);
}
}
Это было так просто, как я и думал.:)
Оригинальный вопрос
Я использую следующий код, чтобы изменить ForeColor
элементов, для которых выбранное действие уже выполнено.
public partial claass MyForm: Form
private void bgProgress_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Global.grayOut(ref this.lvUsers);
}
...
public static class Global
internal static void grayOut(ref ListView myLV)
{
//change each selected item to gray text
//currently, multiselect is turned off, so this will only be one item at a time
foreach (ListViewItem item in myLV.SelectedItems)
{
item.UseItemStyleForSubItems = false;
item.ForeColor = Color.Gray;
item.Font = new Font("MS Sans Serif", 10, FontStyle.Italic);
item.Selected = false;
}
myLV.Refresh();
}
У меня две проблемы.
- Свойство изменяется, но это изменение не отображается. Другими словами, я знаю, что
ForeColor
изменяется на серый, потому что позже я проверяю, является ли он серым, когда пользователь пытается выполнить определенное действие. Тем не менее, он не отображается серым цветом или курсивом. Я также использую следующее, чтобы попытаться отменить
MouseDown
событие, чтобы не дать элементу быть выбранным снова, но он все равно остается выбранным:private void lvUsers_MouseDown(object sender, MouseEventArgs e) { // Make sure it was a single left click, like the normal Click event if (e.Button == MouseButtons.Left) { ListViewHitTestInfo htInfo = lvUsers.HitTest(e.X, e.Y); if (htInfo.Item.ForeColor == Color.Gray) { return; } } }
Я не нашел другого способа отменить MouseDown
событие, так что я не уверен, что еще можно попробовать.
1 ответ
Вы можете получить то, что вам нужно, полагаясь на метод, связанный с SelectedIndexChanged Event
, Образец кода:
private void myLV_SelectedIndexChanged(object sender, EventArgs e)
{
if (myLV.SelectedItems.Count > 0)
{
foreach (ListViewItem item in myLV.SelectedItems)
{
if (item.ForeColor == Color.Gray)
{
item.Selected = false;
}
else
{
ListViewItem tempItem = item;
grayOut2(ref tempItem);
}
}
}
}
Этот код выделяет любой элемент, который вы выбрали, если он не был выбран ранее (не выделен серым цветом); в противном случае он избегает его выбора. GrayOut2
это версия вашей функции только с учетом данного пункта.
internal static void grayOut2(ref ListViewItem item)
{
//change each selected item to gray text
//currently, multiselect is turned off, so this will only be one item at a time
item.UseItemStyleForSubItems = false;
item.ForeColor = Color.Gray;
item.Font = new Font("MS Sans Serif", 10, FontStyle.Italic);
item.Selected = false;
}