2010-02-05 4 views
0

J'ai listView dans mon programme (C#). Je change certaines couleurs d'arrière-plan et d'avant-plan après avoir ajouté des éléments à listview. Tous les articles sont OK et les couleurs aussi. Si j'utilise le tri avec listView, alors toutes les 6 premières couleurs d'éléments ont disparu. Et certaines couleurs des objets de repos sont en désordre. Cet effet se produit avec le tri par défaut et mon propre trieur personnalisé. Je fais beaucoup de changements aux données listView items et finalement quand listView a été trié plusieurs fois toutes les couleurs sont dans les bonnes positions. Qu'est-ce qui ne va pas?Problème avec les couleurs d'arrière-plan et de premier plan de listView lorsque listView est trié

+0

Les couleurs restent-elles avec les mêmes rangées sans égard à leur commande? –

+0

Avez-vous du code que vous pouvez partager? J'ai plusieurs projets qui utilisent le contrôle System.Windows.Forms.ListView, lignes colorées/texte et ListViewItemComparers personnalisés sans aucun problème. –

Répondre

0

Messed autour pour un peu et je ne suis pas sûr de ce que vous pourriez faire mal. Cela semble bien fonctionner pour moi mais sans voir votre code, il est difficile de dire ce qui se passe. En tout cas, voici un exemple de travail simple qui pourrait vous aider à comprendre ce qui est différent. Il suffit de créer un formulaire avec une vue ListView à 3 colonnes dans la vue Details:

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

Désolé, mon programme change certaines des couleurs des sous-éléments. –

0

Maintenant, cela fonctionne. Je viens de désactiver le tri:

listView1.ListViewItemSorter = null;

Et après toute modification a été fait, le tri est activé à nouveau:

listView1.ListViewItemSorter = new Sorter();