Laden...

IComparer Problem

Erstellt von gX|progs vor 17 Jahren Letzter Beitrag vor 17 Jahren 10.385 Views
G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren
IComparer Problem

Hallo,

ich versuche eine ListView mittels einen Klick auf die Colum zu sortieren. Dazu hab ich folgende ICompare Klasse:

public class ListViewComparer : IComparer
    {
        private int col;
        private SortOrder order;

        public ListViewComparer(int col, SortOrder order)
        {
            this.col = col;
            this.order = order;
        }
        public int Compare(ListViewItem x, ListViewItem y)
        {
            ListViewItem item1, item2;
            item1 = (ListViewItem)x;
            item2 = (ListViewItem)y;
            if (this.order == SortOrder.Ascending)
                return item1.SubItems[col].Text.CompareTo(item2.SubItems[col].Text);
            else
                return item2.SubItems[col].Text.CompareTo(item1.SubItems[col].Text);
        }
    }

Die Column-Click Methode schaut folgendermaßen aus:

        // Spalten sortieren
        private void lstview_vertreter_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (lstview_vertreter.Sorting == SortOrder.Ascending)
            {
                lstview_vertreter.Sorting = SortOrder.Descending;
                lstview_vertreter.ListViewItemSorter = new ListViewComparer(e.Column, SortOrder.Descending);
            }
            else
            {
                lstview_vertreter.Sorting = SortOrder.Ascending;
                lstview_vertreter.ListViewItemSorter = new ListViewComparer(e.Column, SortOrder.Ascending);
            }
        }

Jedoch erhalte ich immer folgende Fehlermeldung:

Fehler 1 Die Verwendung von Typ "System.Collections.Generic.IComparer<T>" (generisch) macht das 1-Typargument erforderlich.

Weiß jeder woran das liegen könnte?

Martin Bauer - bauer-martin.com

B
1.529 Beiträge seit 2006
vor 17 Jahren
public class ListViewComparer : IComparer< ListViewItem >
G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

"ProvisionsberechnungWindowsForms.ListViewComparer" implementiert den Schnittstellenmember "System.Collections.Generic.IComparer<System.Windows.Forms.ListViewItem>.Compare(System.Windows.Forms.ListViewItem, System.Windows.Forms.ListViewItem)" nicht.

Martin Bauer - bauer-martin.com

B
1.529 Beiträge seit 2006
vor 17 Jahren

Passiert manchmal, dass er das nicht erkennt. Schreib mal public int IComparer<ListViewItem>.Compare( ... )

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

Nun kommt folgende Fehlermeldung:

Der public-Modifizierer ist für dieses Element nicht gültig.

Wenn ich dann das public vor der Methode lösche, kommt zum einen der Fehler von oben und noch folgender:

"IComparer<...>.Compare" in der expliziten Schnittstellendeklaration ist kein Member der Schnittstelle.

Was mich wunder ist folgendes: Ich habe beide Methoden aus einem Beispiel kopiert und angepasst (http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_19_014.htm#Xxxobkap1901404001a5d1f044257) und dort funktioniert es ja auch ohne Angaben eines Typarguments oder ähnlichen.

Martin Bauer - bauer-martin.com

W
558 Beiträge seit 2006
vor 17 Jahren

Hallo!

Ich konnte in deiner Version zwar keinen Fehler finden, habe mir vor kurzem aber selbst einen Sorter geschrieben:

Kannst du gerne damit vergleichen oder auch benutzen:


using System;
using System.Windows.Forms;
using System.Collections;

namespace LVsorter
{
	public class LVColumnSorter : IComparer
	{
		private int ColumnToSort = 0;
		private SortOrder OrderOfSort = SortOrder.Ascending;
		private NumberCaseInsensitiveComparer NCIComparer = new NumberCaseInsensitiveComparer();
		
		public int Compare(object x, object y)
		{
			int compareResult;
			
			ListViewItem listviewX = (ListViewItem)x;
			ListViewItem listviewY = (ListViewItem)y;
			
			compareResult = NCIComparer.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
			
			if (OrderOfSort == SortOrder.Descending)
			{
				return compareResult;
			}
			else
			{
				return (-compareResult);
			}
		}
		
		public int SortColumn
		{
			//Setter und Getter für Variable ColumnToSort
			set
			{
				ColumnToSort = value;
			}
			get
			{
				return ColumnToSort;
			}
		}
		
		public SortOrder Order
		{
			//Setter und Getter für Variable OrderOfSort
			set
			{
				OrderOfSort = value;
			}
			get
			{
				return OrderOfSort;
			}
		}
	}
	
	public class NumberCaseInsensitiveComparer : CaseInsensitiveComparer
	{
		public new int Compare(object x, object y)
		{
			int intX, intY;
			
			if ((x is String) && (y is String) && (Int32.TryParse(x.ToString(), out intX)) && (Int32.TryParse(y.ToString(), out intY)))
			{
				return base.Compare(intX, intY);
			}
			else
			{
				return base.Compare(x, y);
			}
		}
	}
}

Hoffe konnte helfen.

mfg
webstarg

3.825 Beiträge seit 2006
vor 17 Jahren

Trage am Anfang

using System.Collections;
using System.Collections.Generic;

ein. Beide sind wichtig.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

@webstarg: Danke, mit deiner Klasse gehts. Verwende jetzt mit ein paar kleinen Änderungen diese. Was jedoch genau anders ist, wieso meine alte nicht geht, weiß ich leidern icht.

Martin Bauer - bauer-martin.com

W
558 Beiträge seit 2006
vor 17 Jahren

Hallo!

Ich habe jetzt den Verdacht er akzeptiert deine Parameterliste nicht.

Versuche bei der Methode Compare die Parameter ListViewItem mit object zu ersetzen.

mfg
webstarg

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

Nein, daran liegt es auch nicht. Dann verlangt er nach der Methode Compare(object, object)

Martin Bauer - bauer-martin.com

T
433 Beiträge seit 2006
vor 17 Jahren

Wie BerndFfm schon festgestellt hat fehlt in deinem Originalcode


using System.Collections;

Du hast nur das System.Collections.Generics eingebunden, aber in diesem Namespace gibts nur IComparer<T>.

Gruß,
Tom

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

Nein, ich hab auch Systems.Collections eingebunden, gleiche Fehler.

Martin Bauer - bauer-martin.com

B
1.529 Beiträge seit 2006
vor 17 Jahren

Schon mal "Erstellen\Projektmappe bereinigen" und dann "Erstellen\Projektmappe neu erstellen" probiert?

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

Bringt auch nichts, gleiches Problem. Ist bestimmt wieder nur irgend eine ganz winzige Kleinigkeit.

Martin Bauer - bauer-martin.com

B
1.529 Beiträge seit 2006
vor 17 Jahren

Schneide mal die komplette Compare-Methode aus, und lösche das :IComparer<>.
Dann Bereinigen und neu Erstellen, im Anschluss wieder :IComparer<> ran, von VS die Methodenrümpfe des Interface generieren lassen und den Code wieder einfügen...

T
433 Beiträge seit 2006
vor 17 Jahren

Die Fehlermeldung besagt das er dein normalen IComparer nicht kennt.
Das Interface befindet sich aber in System.Collections.

Dein Compiler kennt gerade nur IComparer<T>, aber keine Ahnung wieso.
Weil das Interface wiederrum nur in System.Collections.Generics liegt.

Der Code sollte eigentlich funktionieren (ist ja auch das Beispiel aus der MSDN).

Sorry wenn ich nicht mehr weiterhelfen kann.

Gruß,
Tom

G
gX|progs Themenstarter:in
146 Beiträge seit 2006
vor 17 Jahren

Ich find das auch ziemlich komisch. Aber da die andere Klasse funktioniert, auch erstmal egal. Wenn ich mal Zeit hab, werd ich mich damit nochmal beschäftigen. Vielleicht find ich dann ja das Problem.

Martin Bauer - bauer-martin.com