排序listView时listView背景和前景色问题

时间:2010-02-05 20:16:02

标签: c# sorting listview colors

我的(C#)程序中有listView。在将项目添加到listview后,我更改了一些项目背景和前景色。所有项目都可以和颜色一样。 如果我使用listView排序,那么所有前6项颜色都已消失。一些颜色的休息项目是无序的。 默认排序和我自己的自定义排序器会发生这种效果。 我对listView项目数据做了很多更改,最后当listView被多次排序时,所有颜色都处于正确的位置。 怎么了?

2 个答案:

答案 0 :(得分:0)

稍微讨论一下,我不确定你做错了什么。似乎对我工作正常,但没有看到你的代码,很难说是发生了什么。在任何情况下,这是一个简单的工作示例,可以帮助您找出不同的东西。只需在详细信息视图中创建一个包含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

}

答案 1 :(得分:0)

现在它有效。我只是关闭排序:

listView1.ListViewItemSorter = null;

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

listView1.ListViewItemSorter = new Sorter();