【问题标题】:Issue with listView background and foreground colors when listView is sorted对 listView 进行排序时,listView 背景和前景色出现问题
【发布时间】:2010-02-05 20:16:01
【问题描述】:

我的 (C#) 程序中有 listView。将项目添加到列表视图后,我更改了一些项目的背景和前景色。所有物品都可以,颜色也可以。 如果我使用 listView 进行排序,那么所有前 6 个项目的颜色都已消失。并且一些休息项目的颜色是杂乱无章的。 这种效果发生在默认排序和我自己的自定义排序器中。 我对 listView 项目数据做了很多更改,最后当 listView 多次排序时,所有颜色都在正确的位置。 怎么了?

【问题讨论】:

  • 颜色是否保持在同一行而不考虑它们的顺序?
  • 你有什么代码可以分享吗?我有几个项目使用 System.Windows.Forms.ListView 控件、彩色行/文本和自定义 ListViewItemComparers 没有任何问题。

标签: c# sorting listview colors


【解决方案1】:

搞砸了一点,我不确定你做错了什么。对我来说似乎工作正常,但没有看到你的代码很难说发生了什么。无论如何,这是一个简单的工作示例,可以帮助您找出不同之处。只需在 Details 视图中创建一个包含 3 列 ListView 的表单:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Color[] backgroundColors = new[] { Color.Green, Color.White, Color.Blue };
        Color[] foregroundColors = new[] { Color.Black, Color.Red, Color.Yellow };

        Random random = new Random();

        for (int i = 0; i < 100; i++)
        {
            Color backgroundColor = backgroundColors[random.Next(0, 3)];
            Color foregroundColor = foregroundColors[random.Next(0, 3)];

            ListViewItem listViewItem = listView1.Items.Add(foregroundColor.Name);
            listViewItem.SubItems.Add(backgroundColor.Name);
            listViewItem.SubItems.Add(Guid.NewGuid().ToString());
            listViewItem.BackColor = backgroundColor;
            listViewItem.ForeColor = foregroundColor;
        }

        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
    }

    private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        ListViewItemComparer listViewItemComparer = new ListViewItemComparer {SortColumn = e.Column, Sorting = SortOrder.Ascending};

        if (listView1.ListViewItemSorter is ListViewItemComparer)
        {
            ListViewItemComparer listViewItemComparerOld = listView1.ListViewItemSorter as ListViewItemComparer;

            if (listViewItemComparerOld != null && listViewItemComparerOld.SortColumn == e.Column)
            {
                listViewItemComparer.Sorting = (listViewItemComparerOld.Sorting == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending;
            }
        }

        listView1.ListViewItemSorter = listViewItemComparer;
        listView1.Sort();
    }

    #region ListViewItemComparer
    public class ListViewItemComparer : IComparer
    {
        #region Public Properties
        public int SortColumn { get; set; }
        public SortOrder Sorting { get; set; }
        #endregion

        public ListViewItemComparer()
        {
            SortColumn = 0;
            Sorting = SortOrder.Ascending;
        }

        public int Compare(object x, object y)
        {
            ListViewItem listViewItem1 = null;
            ListViewItem listViewItem2 = null;

            string compare1 = string.Empty;
            string compare2 = string.Empty;

            if (Sorting == SortOrder.Ascending)
            {
                listViewItem1 = (ListViewItem)x; listViewItem2 = (ListViewItem)y;
            }
            if (Sorting == SortOrder.Descending)
            {
                listViewItem1 = (ListViewItem)y; listViewItem2 = (ListViewItem)x;
            }

            if (listViewItem1 != null && (SortColumn < listViewItem1.SubItems.Count) && (listViewItem1.SubItems[SortColumn] != null))
            {
                compare1 = listViewItem1.SubItems[SortColumn].Text;
            }

            if (listViewItem2 != null && (SortColumn < listViewItem1.SubItems.Count) && (listViewItem2.SubItems[SortColumn] != null))
            {
                compare2 = listViewItem2.SubItems[SortColumn].Text;
            }

            return string.Compare(compare1, compare2);
        }
    }

    #endregion

}

【讨论】:

  • 对不起,我的程序改变了一些子项的颜色。
【解决方案2】:

现在可以了。我只是关闭排序:

listView1.ListViewItemSorter = null;

完成所有更改后,再次打开排序:

listView1.ListViewItemSorter = new Sorter();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2011-05-09
    • 2011-09-19
    • 2019-11-02
    相关资源
    最近更新 更多