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
public class ListViewComparer : IComparer< ListViewItem >
"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
Passiert manchmal, dass er das nicht erkennt. Schreib mal public int IComparer<ListViewItem>.Compare( ... )
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
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
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
@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
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
Nein, daran liegt es auch nicht. Dann verlangt er nach der Methode Compare(object, object)
Martin Bauer - bauer-martin.com
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
Nein, ich hab auch Systems.Collections eingebunden, gleiche Fehler.
Martin Bauer - bauer-martin.com
Schon mal "Erstellen\Projektmappe bereinigen" und dann "Erstellen\Projektmappe neu erstellen" probiert?
Bringt auch nichts, gleiches Problem. Ist bestimmt wieder nur irgend eine ganz winzige Kleinigkeit.
Martin Bauer - bauer-martin.com
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...
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
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