2010-02-05 73 views
0

我在我的(C#)程序中有listView。在將項添加到列表視圖後,我更改了一些項目背景和前景色。所有項目都OK和顏色。 如果我使用listView排序,那麼所有前6種顏色已經消失。有些休閒用品的顏色混亂。 這種效果發生在默認排序和我自己的自定義排序器上。 我對listView項目數據做了很多更改,最後當listView被多次排序後,所有的顏色都處於正確的位置。 有什麼不對?listView排序時listView背景和前景顏色問題

+0

顏色是否與相同的行保持不變而不考慮它們的順序? – 2010-02-05 20:18:08

+0

你有任何可以分享的代碼嗎?我有幾個使用System.Windows.Forms.ListView控件,彩色行/文本和自定義ListViewItemComparers沒有任何問題的項目。 – 2010-02-05 20:49:36

回答

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 

} 
+0

對不起,我的程序改變了一些子項目的顏色。 – 2010-02-06 08:28:42

0

現在它可以工作。我只是關閉排序:

listView1.ListViewItemSorter = null;

而且所有更改後已經取得,排序再次開啓:

listView1.ListViewItemSorter =新的分揀機();