如何更改ObjectListView行的背景色?

时间:2019-04-05 08:55:30

标签: c# objectlistview

我有BrightIdeasSoftware的objectlistview。目前,我可以添加和删除此列表,但是我不能绘制行颜色(没有标题)。简单来说,我想将列表的一半重新着色为红色,其余部分重新着色为蓝色。

通常我会这样做:

            for (int i = 0; i < index; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.LightGray;
            }
            mainForm.MyListView.Items[index].BackColor = Color.DarkGreen;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.FromArgb(18, 18, 18);
            }

但是这不起作用,我也尝试在给对象重新着色后刷新对象,但是仍然不起作用。我已经检查过this,但我不想在只给一个索引然后重新着色列表视图的情况下进行此操作。

有人可以告诉我如何实现这一目标吗?非常感谢

编辑:我将分享我的整个方法,这样会更清楚。

public void PaintToIndex(int index)
        {
            for (int i = 0; i < index; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.LightGray;
            }
            mainForm.MyListView.Items[index].BackColor = Color.DarkGreen;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.FromArgb(18, 18, 18);
            }

        }

EDIT2:我想我可能会发现一些东西,我已经将方法更改为此,但是它正在自我更新。

            for (int i = 0; i < index; i++)
            {
                OLVListItem CurItem = mainForm.MyListView.GetItem(i);
                CurItem.BackColor = Color.LightGray;
                //mainForm.MyListView.RefreshItem(CurItem);
            }
            mainForm.MyListView.GetItem(index).BackColor = Color.LightGray;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                OLVListItem CurItem = mainForm.MyListView.GetItem(i);
                CurItem.BackColor = Color.FromArgb(18, 18, 18);
                //mainForm.MyListView.RefreshItem(CurItem);
            }

当我打开RefreshItem时,它会将我的OLVListItem更新回以前的颜色。

编辑3: 我找到了解决方案。设置完所有颜色后,我进行了Refresh()操作,但现在又遇到另一个问题,当我将鼠标悬停在鼠标上时,颜色会变回原来的状态。

2 个答案:

答案 0 :(得分:1)

其站点上的文档包括very similar example。您监听FormatRow或FormatCell事件。

  

要在客户欠款时以红色显示客户,您可以在IDE中为FormatRow事件设置处理程序,然后执行以下操作:

private void olv1_FormatRow(object sender, FormatRowEventArgs e) {
    Customer customer = (Customer)e.Model;
    if (customer.Credit < 0)
        e.Item.BackColor = Color.Red;
}
  

要更改单个单元格的格式,需要将UseCellFormatEvents设置为true,然后侦听FormatCell事件。要仅以红色显示信用余额,您可以执行以下操作:

private void olv1_FormatCell(object sender, FormatCellEventArgs e) {
    if (e.ColumnIndex == this.creditBalanceColumn.Index) {
        Customer customer = (Customer)e.Model;
        if (customer.Credit < 0)
            e.SubItem.ForeColor = Color.Red;
    }
}
  

这些事件与UseAlternatingBackColors一起很好地发挥作用。您在这些事件中所做的任何格式化均优先于备用背景色。

     

这些事件知道该行将在控件中出现的位置,因此该事件的DisplayIndex属性可用于更复杂的备用背景配色方案。即使列表显示组并且列表视图是虚拟的,DisplayIndex也是正确的。

     

为提高性能,仅当FormatRow事件的处理程序将UseCellFormatEvents设置为true时,才会触发FormatCell事件。如果要为每个单元格触发FormatCell事件,则可以在ObjectListView本身上设置UseCellFormatEvents。

答案 1 :(得分:0)

好的,我找到了解决方案。 这就是我的方法

            int CurrentIndex = StaticVariables.MyListView.GetPlaylistCurrentIndex();
            int count = StaticVariables.MyListView.GetPlaylistCount();
            for (int i = 0; i < CurrentIndex; i++)
            {
                OLVListItem item = mainForm.MyListView.GetItem(i);
                item.BackColor = Color.FromArgb(35, 35, 35);
            }
            for (int i = CurrentIndex; i < count; i++)
            {
                OLVListItem item = mainForm.MyListView.GetItem(i);
                item.BackColor = Color.FromArgb(18, 18, 18);
            }
            OLVListItem item2 = mainForm.MyListView.GetItem(CurrentIndex);
            item2.BackColor = Color.DarkGreen;
            mainForm.MyListView.Refresh();

我在FormatRow事件上调用此方法。我还要提及1件事。在我将UseHotControls设置为false之前,此方法不起作用。您知道当您将鼠标悬停在单元格或行或任何​​其他元素上时,此属性会做一些花哨的事情,但是我猜它不能很好地解决背景色更改,因为当它为真时(默认情况下),我的ObjectListView不会更新它的背景色,直到我将鼠标移到OLV上或单击任何项​​目,但是当我将鼠标悬停并激活HotControl时,它们会将颜色更改回原始(透明)。我设法更改了HotControl的背景色,但随后仍然有无法更新自身的问题。在我将UseHotControls设置为false并调用相同的方法后,一切工作正常。如果有人需要它,我将在此处保留此方法和较长的段落。