ListViewItem.ForeColor更改不显示

时间:2013-08-27 13:45:28

标签: c# listview colors mousedown

编辑:我是假人

所以......事实证明问题出在以下几行;

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;
            }
        }
    }
    
  3. 我还没有找到任何其他取消MouseDown事件的方法,所以我不确定还有什么可以尝试。

1 个答案:

答案 0 :(得分: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;
}