Mit VisualStudio ist alles ganz einfach. Man muß nur noch klicken. Nix mehr programmieren. Soll etwa ein GridView Daten sortieren muß man nur noch „AllowSorting“ anklicken – fertig!
Oder etwa doch nicht? Nunja, das „Programming by clicking“ funktinoiert unbestritten – aber nur, wenn man sich haargenau an die Vorgaben hält. So funktioniert das Sortieren nur dann, wenn das Grid mit der „richtigen“ Datenquelle verbunden ist. Holt man sich die Daten aber (wie ich) über die DataSource-Eigenschaft (z.B. mit einem TableAdapter), dann zerbricht die schöne heile Klicky-Welt.
Dann geht die Suche los: wie muß ich das jetzt programmieren? Was? Etwa mit der Tastatur? Nicht mit der Maus? Neeein!
Es ist gar nicht so einfach, hier mit der Hilfe und dem Web eine Lösung zu finden. Man darf nämlich nicht einfach einen TableAdapter verwenden – nein, es muß schon eine DataView sein. Denn nur die hat eine Sortierfunktion, der TableAdapter nicht!
Und es reicht auch nicht, diesem DataView zu sagen, was es wie sortieren soll:
(GridView2.DataSource as DataView).Sort = e.SortExpression+" "+Sort;
man muß dem Grid auch jedes Mal auf’s neue erklären, dass es sich an diese DataView binden soll!
GridView2.DataBind();
Dafür sortiert das Ding dann aber auch – doch nur in eine Richtung. Nämlich aufsteigend. Will man bei erneutem klicken der Spalte absteigend sortieren, dann wird’s schon wieder komplizierter. Denn dann muß man sich den aktuellen Sortierstatus im ViewState merken!
Ahhhh….
So hechelt man von einem Problem zum anderen. Und immer wieder stolpert man über so wunderschöne Fußangeln wie z.B. mit der SortDirection! Die hat den Wert „ascending“ und „descending“. Wunderbar! Logisch!
Aber die DataView.Sort – Methode kennt so was natürlich nicht, die braucht ein ASC bzw. ein DESC als Stringwert. Also muß man das wieder manuell umwandeln..
string Sort;
if (e.SortDirection == SortDirection.Ascending)
Sort = "ASC";
else Sort = "Desc";
Ach, ich weiß nicht. Mit .NET wird alles so kompliziert und umständlich. Was mit einer gscheiden Programmiersprache (Delphi !!) mit einem Objekt erledigen kann, muß man in .NET mit mindestens 3 Objekten und über 5 Ecken machen!! So unschön…
Aber dafür kann mein Grid jetzt auch sortieren. Ich habe ja nur gut 4 Stunden gebraucht um das alles herauszufinden.
Aber vielleicht liegt das ja auch nicht am .NET – vielleicht bin ich einfach nicht fürs Programmieren geschaffen und zu dämlich dafür…
protected void GridView2_Sorting(object sender, GridViewSortEventArgs e)
{
// Erst mal prüfen, ob ich mir schon eine SortExpression gemerkt habe
if (ViewState["SortExpression"] != null)
{
if (((string)ViewState["SortExpression"] == e.SortExpression) &
((SortDirection)ViewState["SortDirection"] == e.SortDirection))
//wenn ich mir die gleiche Sortierung schon gemerkt habe, dann muß
//ich die Sortierrichtung ändern
{
if (e.SortDirection == SortDirection.Ascending)
e.SortDirection = SortDirection.Descending;
else e.SortDirection = SortDirection.Ascending;
}
}
// Da das DataView mit "Ascending" und "Descending" nichts anfangen kann
// sondern ein ASC oder DESC braucht, muß man das erst noch umwandeln.
string Sort;
if (e.SortDirection == SortDirection.Ascending)
Sort = "ASC";
else Sort = "Desc";
//Endlich kann ich sortieren!
(GridView2.DataSource as DataView).Sort = e.SortExpression+" "+Sort;
GridView2.DataBind();
//Und hier noch die aktuelle Sortierung merken, fürs nächstemal
ViewState.Add("SortExpression", e.SortExpression);
ViewState.Add("SortDirection", e.SortDirection);
}