Archief - [C#] Listview sorting met grouping op windows XP

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

breez

Legacy Member
Ik heb een listview met detail view en enkele kolommen. Ik heb een stuk code van msdn gehaald om sorting te activeren (en lichtjes aangepast op 1 bepaalde kolom)

code:
Code:
public class ListViewSorter : IComparer
    {
        /// <summary>
	    /// Specifies the column to be sorted
	    /// </summary>
	    private int ColumnToSort;
	    /// <summary>
	    /// Specifies the order in which to sort (i.e. 'Ascending').
	    /// </summary>
	    private SortOrder OrderOfSort;
	    /// <summary>
	    /// Case insensitive comparer object
	    /// </summary>
	    private CaseInsensitiveComparer ObjectCompare;

	    /// <summary>
	    /// Class constructor.  Initializes various elements
	    /// </summary>
	    public ListViewSorter()
	    {
		    // Initialize the column to '0'
		    ColumnToSort = 0;

		    // Initialize the sort order to 'none'
		    OrderOfSort = SortOrder.None;

		    // Initialize the CaseInsensitiveComparer object
		    ObjectCompare = new CaseInsensitiveComparer();
	    }

	    /// <summary>
	    /// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
	    /// </summary>
	    /// <param name="x">First object to be compared</param>
	    /// <param name="y">Second object to be compared</param>
	    /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
	    public int Compare(object x, object y)
	    {
		    int compareResult;
		    ListViewItem listviewX, listviewY;

		    // Cast the objects to be compared to ListViewItem objects
		    listviewX = (ListViewItem)x;
		    listviewY = (ListViewItem)y;

		    // Compare the two items
            if ((listviewX.ListView.Columns[ColumnToSort].Text == "Local Version"))
            {
                compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].BackColor.ToString(), listviewY.SubItems[ColumnToSort].BackColor.ToString());
            }
            else
            {
                compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
            }
		    
			
		    // Calculate correct return value based on object comparison
		    if (OrderOfSort == SortOrder.Ascending)
		    {
			    // Ascending sort is selected, return normal result of compare operation
			    return compareResult;
		    }
		    else if (OrderOfSort == SortOrder.Descending)
		    {
			    // Descending sort is selected, return negative result of compare operation
			    return (-compareResult);
		    }
		    else
		    {
			    // Return '0' to indicate they are equal
			    return 0;
		    }
	    }
    
	    /// <summary>
	    /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
	    /// </summary>
	    public int SortColumn
	    {
		    set
		    {
			    ColumnToSort = value;
		    }
		    get
		    {
			    return ColumnToSort;
		    }
	    }

	    /// <summary>
	    /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
	    /// </summary>
	    public SortOrder Order
	    {
		    set
		    {
			    OrderOfSort = value;
		    }
		    get
		    {
			    return OrderOfSort;
		    }
	    }
    }

Ook is er grouping toegevoegd. Ieder listviewitem wordt dus aan een bepaalde groep toegevoegd.
Deze code werkt perfect op Windows 7, maar op Windows XP weigert hij de listviewitems te sorteren indien grouping gebruikt wordt.
Wanneer ik geen grouping toepas werkt het sorteren wél op XP

Iemand een idee?

Parnakra

Legacy Member
Zo'n probleem zal eerder aan de omgeving liggen dan aan de code.

Al eens op verschillende XP machines gedraaid? Gecontroleerd of dezelfde .NET runtime geïnstalleerd is?

/edit: trouwens, waarom niet gewoon String.Compare gebruiken i.p.v. een (zelfgeschreven?) CaseInsensitiveComparer?

Destiser

Legacy Member
grouping werkt niet op XP dacht ik... onlangs ook die grouping feature van listview onder de loep genomen en ergens gelezen (msdn zelfs) dat xp dat niet ondersteunde

edit 1:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.groups.aspx

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2


Dus vanaf SP3 blijkbaar wel, check dat eens anders

edit 2:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listviewgroup.aspx

ListView groups are available only on Windows XP and the Windows Server 2003 family when your application calls the Application.EnableVisualStyles method. On earlier operating systems, any code relating to groups will be ignored and the groups will not appear. As a result, any code that depends on the grouping feature might not work correctly. You might want to include a test that determines whether the grouping feature is available, and provide alternate functionality when it is unavailable. For example, you might want to provide alternate sorting when running on operating systems that do not support sorting by group.
The insertion mark feature is provided by the same library that provides the operating system themes feature. To check for the availability of this library, call the FeatureSupport.IsPresent(Object) method overload and pass in the OSFeature.Themes value.

-> Dus toch wel wrs mits enablevisualstyles (wat standaard zo is in program sectie...)

edit 3:

blijkbaar is het dus de sorting die niet werkt maar de grouping wel, ja sorry 'k ben nog nie wakker, 'k ga best nog ff in bed gaan liggen...

breez

Legacy Member
Parnakra zei:
Zo'n probleem zal eerder aan de omgeving liggen dan aan de code.

Al eens op verschillende XP machines gedraaid? Gecontroleerd of dezelfde .NET runtime geïnstalleerd is?
zowel op de xp (sp3) machine als de windows 7 machine zijn de laatste versie van .NET 4.0 Full geïnstalleerd

Destiser zei:
grouping werkt niet op XP dacht ik... onlangs ook die grouping feature van listview onder de loep genomen en ergens gelezen (msdn zelfs) dat xp dat niet ondersteunde
grouping op zicht werkt wel, de groepen worden weergegeven
Op msdn had ik al gelezen dat je applicatie enableVisualStyles moet aanroepen om grouping te laten werken op XP (wat dus ook gebeurt in mijn applicatie), maar op diezelfde pagina heb ik niets gelezen omtrent het al dan niet werken van items sorteren in groepen
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan