【问题标题】:Change color of an entire column in a ListView更改 ListView 中整列的颜色
【发布时间】:2016-06-18 19:13:09
【问题描述】:

我在 ListView 中有三列,我想将第三列中的每个值都更改为绿色前景色。

用户名、电子邮件、状态

这是我的三列,所有列的名称也如所见。

我尝试过类似的方法但失败了,因为它只是将它添加到列表视图中,而不是在添加到列表视图时更改第三列值的颜色。

        var Status = new ListViewItem("Status");
        Status.SubItems[0].ForeColor = Color.FromArgb(-16711936);
        Status.UseItemStyleForSubItems = false;

        Pless_ListView.Items.Add(Status);

我也试过这么简单的方法,还是不行。

Pless_ListView.Items[2].ForeColor = Color.Green;

我也尝试过编辑它,将 Status 值添加到 ListView 中,如下所示。

account.SubItems.Add(Status).ForeColor = Color.Green;

这个也没有运气。

我也尝试过搜索,但不知道在哪里可以找到答案。

编辑:

这是我添加到 ListView 的代码。

        void ColorLvColumn(ListView lv, int columnIndex, Color color, bool foreground)
    {
        foreach (ListViewItem lvi in lv.Items)
        {
            lvi.UseItemStyleForSubItems = false;  // allow individual styles for subitems!
            if (columnIndex < lvi.SubItems.Count)
            {
                if (foreground) lvi.SubItems[columnIndex].ForeColor = color;
                //else lvi.SubItems[columnIndex].BackColor = color;
            }
        }
    }

    private void addAccountToPlessLV(String Username, String Password, PlessHTTP captured)
    {
        if (InvokeRequired)
        {
            Invoke(new MethodInvoker(delegate
            {
                ColorLvColumn(Pless_ListView, 2, Color.Green, true);
                ListViewItem account = new ListViewItem { Text = Username };
                account.SubItems.Add(Email);
                account.SubItems.Add(captured.Status).BackColor = Color.Green;
                Pless_ListView.Items.Add(account);
            }));
        }
        else
        {
            ColorLvColumn(Pless_ListView, 2, Color.Green, true);
            ListViewItem account = new ListViewItem { Text = Username };
            account.SubItems.Add(Email);
            account.SubItems.Add(captured.Status)
            Pless_ListView.Items.Add(account);
        }
    }

【问题讨论】:

    标签: c# listview


    【解决方案1】:

    这为列中的每个项目/子项目设置颜色:

    void ColorLvColumn(ListView lv, int columnIndex, Color color, bool foreground)
    {
        foreach (ListViewItem lvi in lv.Items)
        {
            lvi.UseItemStyleForSubItems = false;  // allow individual styles for subitems!
            if (columnIndex < lvi.SubItems.Count)
            {
                if (foreground) lvi.SubItems[columnIndex].ForeColor = color;
                else lvi.SubItems[columnIndex].BackColor = color;
            }
        }
    }
    

    这样称呼它:

    ColorLvColumn( Pless_ListView, 2, Color.Green, true);
    

    关于您的代码的两个注意事项:

    • 我注意到您写道:Status.SubItems[0],但 第三 列将是 Status.SubItems[2]

    • 要为它着色,您必须先添加缺少的两个子项

    可以使用构造函数来做到这一点:

    ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
    lvsi.ForeColor = Color.LimeGreen;
    

    并将其添加到Items.SubItems 集合中:

    someItem.subItems.Addlvsi ();
    

    但是使用 SubItems(string) 重载添加它也可以。注意必须按顺序添加!

    请注意,创建Columns 不会创建任何SubItems。它只是创建了一个可以显示SubItems 的空间。

    这意味着ListViewItems.SubItems 是一个锯齿状数组

    【讨论】:

    • 唯一的问题是它们是多线程添加的,因此一次向 ListView 添加了多个实例,这导致它出现问题。同样在测试它时,它并没有为我改变它。
    • 好的,感谢该更新对我的帮助很大,但现在看来它正在为背景着色,而不是实际的文本颜色。你会建议如何制作它,所以它只是为文本颜色而不是列着色?非常感谢我试图弄乱它但没有运气。
    • 嗯,这个函数需要一个布尔值来控制颜色。你用过吗?您需要使用true 调用它。如果您使用自己的代码,请显示当前版本。您的原始代码总是(尝试)为文本着色..
    • 我正在使用您提供的代码,然后添加了这个 ColorLvColumn(Pless_ListView, 2, Color.Green, true);它将项目添加到 listView 的位置。但它似乎同时为背景和文本着色,当试图让它为文本着色时,它不会。
    • 嗯,这听起来很奇怪。现在,在进行线程处理时可能会发生奇怪的事情,但即便如此,我还是不明白它是如何发生的......你能不能做一个测试并将调用只放在一个按钮中,看看它是否可以正常工作(并且因为它在这里)..
    猜你喜欢
    • 2023-04-06
    • 2012-05-01
    • 1970-01-01
    • 2017-02-04
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多