Изменение 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();
    }

У меня две проблемы.

  1. Свойство изменяется, но это изменение не отображается. Другими словами, я знаю, что ForeColor изменяется на серый, потому что позже я проверяю, является ли он серым, когда пользователь пытается выполнить определенное действие. Тем не менее, он не отображается серым цветом или курсивом.
  2. Я также использую следующее, чтобы попытаться отменить 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;
}
Другие вопросы по тегам