Sortierrichtung umdrehen

  • C#

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von HenryV.

    Sortierrichtung umdrehen

    Moin,
    meine weiblichen Gene scheinen grad wieder durchzuschlagen (soll heißen, ich raff die Logik nicht) oder es ist einfach zu warm hier ( 37 Grad in der Bude).

    C#-Quellcode

    1. private void dgvMitglied_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    2. {
    3. DataGridViewColumn newColumn = dgvMitglied.Columns[e.ColumnIndex];
    4. string dataprop = dgvMitglied.Columns[e.ColumnIndex].DataPropertyName;
    5. DataGridViewColumn oldColumn = dgvMitglied.SortedColumn;
    6. ListSortDirection direction;
    7. string sortOrder;
    8. if (oldColumn != null)
    9. {
    10. if (oldColumn == newColumn && dgvMitglied.SortOrder == SortOrder.Ascending)
    11. {
    12. direction = ListSortDirection.Descending;
    13. sortOrder = "DESC";
    14. }
    15. else
    16. {
    17. direction = ListSortDirection.Ascending;
    18. sortOrder = "ASC";
    19. oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
    20. }
    21. }
    22. else
    23. {
    24. direction = ListSortDirection.Ascending;
    25. sortOrder = "ASC";
    26. }
    27. using (IDbConnection connection = new MySqlConnection(ConnectionString))
    28. {
    29. var p = new DynamicParameters();
    30. p.Add("p_sortData", dataprop);
    31. p.Add("p_sortOrder", sortOrder);
    32. dgvMitglied.DataSource = null;
    33. dgvMitglied.DataSource = connection.Query("sp_mMitgliedSelectAllOrderIDReverse", p, commandType: CommandType.StoredProcedure).ToList();
    34. newColumn.HeaderCell.SortGlyphDirection = direction == ListSortDirection.Ascending ? SortOrder.Ascending : SortOrder.Descending;
    35. MessageBox.Show("p_sortData = " + dataprop + "\r\np_sortOrder = " + sortOrder);
    36. }
    37. }

    Die Messagebox ist da nur, damit ich sehe, was ankommt.
    Das funktioniert in Richtung ASC, ich krieg das Ding aber nicht überredet, es dann in DESC umzudrehen. Sieht jemand meinen Denkfehler? Für jeden Hinweis dankbar.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Da passiert gar nichts. Hab auch in Zeile 24 noch einen gesetzt, auch nichts. Überspringt er aus irgendeinem Grund den ganzen if-else-Teil? Beim Aufruf des Formulars wird schon das erste Mal sortiert (nach ID DESC). Müsste ich dann den ganzen Code von 30 bis 35 in jeden Teil schreiben? Ich krieg das grad nicht wirklich mit. In der Messagebox kommt die richtige Spalte an (p_sortData = dataprop), aber immer ASC. Und das bei allen Spalten, ich kann also nach jeder Spalte sortieren, aber nur ASC.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Hatori schrieb:

    C#-Quellcode

    1. DataGridViewColumn oldColumn = dgvMitglied.SortedColumn;
    Pack mal diese Zeile aus der Prozedur in die Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Da ist das DGV noch nicht bekannt.

    @HenryV:
    Ob ich das richtig verstanden hab? Hab alle Zeilen mit "direction = " auskommentiert, dann sollte ja nur die Zuordnung von ASC bzw. DESC übrigbleiben. Klappt aber auch nicht, es wird immer ASC sortiert.

    Vollzitate durch Erwähnungen ersetzt. ~Thunderbolt
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Ich muss es über die Abfrage machen, weil das DGV keine DataBinding hat. Ich denke, ich muss den ganzen if-else-Teil innerhalb der using-Anweisung machen, ansonsten wird die sortOrder nicht dem Parameter zugewiesen ... glaub ich. Hab das auch schon probiert, macht aber genau denselben Murks, ASC geht, DESC wird beharrlich ignoriert.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Hatori schrieb:

    Da ist das DGV noch nicht bekannt.
    Nicht die Zuweisung, sondern die Variable.

    HenryV schrieb:

    Das heisst zweimal Rückwärts ergibt Vorwärts.
    Ich gehe mal davon aus, dass Du das experimentell erprobt und verifiziert hast.
    Ansonsten ist diese Aussage Tinnef.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habs jetzt so:

    C#-Quellcode

    1. private void dgvMitglied_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    2. {
    3. DataGridViewColumn newColumn = dgvMitglied.Columns[e.ColumnIndex];
    4. string dataprop = dgvMitglied.Columns[e.ColumnIndex].DataPropertyName;
    5. //DataGridViewColumn oldColumn = dgvMitglied.SortedColumn;
    6. ListSortDirection direction;
    7. string sortOrder;
    8. using (IDbConnection connection = new MySqlConnection(ConnectionString))
    9. {
    10. var p = new DynamicParameters();
    11. sortOrder = "";
    12. //if (oldColumn != null)
    13. if(newColumn != null)
    14. {
    15. if (/*oldColumn == newColumn &&*/ sortOrder == "" || sortOrder == "ASC")
    16. {
    17. sortOrder = "DESC";
    18. }
    19. else
    20. {
    21. sortOrder = "ASC";
    22. }
    23. }
    24. else
    25. {
    26. sortOrder = "ASC";
    27. }
    28. p.Add("p_sortData", dataprop);
    29. p.Add("p_sortOrder", sortOrder);
    30. dgvMitglied.DataSource = null;
    31. dgvMitglied.DataSource = connection.Query("sp_mMitgliedSelectAllOrderIDReverse", p, commandType: CommandType.StoredProcedure).ToList();
    32. MessageBox.Show("p_sortData = " + dataprop + "\r\np_sortOrder = " + sortOrder);
    33. }
    34. }

    Jetzt krieg ich nur noch DESC. Ist auch logisch, bei jedem Klick auf den Spaltenheader kriegt er den leeren String für die sortOrder zugewiesen. Ich muss ihm also irgendwie erklären, dass im Moment DESC zugewiesen ist und auf ASC umgeschaltet werden soll. Und da bricht es ab in meinen grauen Zellen.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Hatori schrieb:

    Ich muss es über die Abfrage machen, weil das DGV keine DataBinding hat.
    Tja, mit Databinding an ein typisiertes Dataset wäre das alles kein Thema.
    Vor allem müsste man nicht, nur um die Sortierung zu ändern, jedesmal dieselben Daten erneut abfragen - die doch eiglich im Client bereits vorhanden sind.
    Ich weiß, Du bist ein Freund von den Dingern. Ich nicht, dafür wurden Datenbanken erfunden :) Im Ernst, DataSource muss reichen, da die Datenbank auch nur lokal läuft, sind Probleme bei Geschwindigkeit und Zugriffshäufigkeit ausgeschlossen. Was mich aber am meisten stört: Für jedes Dataset will das Ding User, Datenbank, Passwort speichern. Das wäre egal, wenn das Teil für mich wäre, aber wie mache ich das, wenn andere das Programm auf einem anderen Computer nutzen? Nein, keine Datasets. Jedenfalls nicht, solange ich nicht wirklich weiß, wie die Dinger auch ohne den ganzen Zugangskram funktionieren. Da genau liegt ja mein Problem, ich bin Amateur und längst nicht so tief in der Materie, wie ich es gern hätte.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Uhm, Datasets verlangen, sofern du die einfach lokal speicherst, überhaupt keine Zugangsdaten. Dafür sind sie aber auch offen einsehbar. Sind ja nur XML Dateien.

    Und danach falls du sie an eine DB anbindest, lädst du die Zugangsdaten einmal.

    Nicht dass ich dich von Dapper abbringen möchte, ich finde es schön mal ein ORM hier in Aktion zu sehen, doch ich habe über die verschiedenen Threads das Gefühl bekommen, dass du generell falsch mit der Datenbankanbindung umgehst, Dapper hin oder her. Aber das geht schon zu sehr vom eigentlichen Thema und Problem hier weg.
    Da magst Du durchaus Recht haben, Earan, wenn ich mir meinen Gesamtcode anschaue, krieg ich auch das würgen, ernsthaft. Wenn das Ding erstmal funktioniert, so dass man es nutzen kann, fang ich nochmal komplett von vorn an und mach es sauber, versprochen. Für den Moment aber muss es erstmal arbeiten, egal wie, es muss Daten speichern und wieder auslesen und eben sortieren. Und ich komm mit dem Ding einfach nicht weiter. Es sortiert nur in eine Richtung. Mir ist klar, warum es das tut, ich weiß nur grad nicht, wie ich es davon überzeuge, auch mal die andere Richtung zu nehmen.
    Und danach falls du sie an eine DB anbindest, lädst du die Zugangsdaten einmal.

    Ja, und genau das will ich eben nicht.



    Ok, ich habs. Bin zwar etwas unsicher, warum es so geht, aber es geht, also bloß nichts mehr anfassen :D Wie vorgeschlagen, das hier ganz nach oben in die Klasse, damit wird es public:

    C#-Quellcode

    1. string ConnectionString = Properties.Settings.Default.ConnString;
    2. DataGridViewColumn newColumn;
    3. string sortOrder;

    Und dann das hier so ähnlich, wie es schon war:

    C#-Quellcode

    1. private void dgvMitglied_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    2. {
    3. newColumn = dgvMitglied.Columns[e.ColumnIndex];
    4. string dataprop = dgvMitglied.Columns[e.ColumnIndex].DataPropertyName;
    5. using (IDbConnection connection = new MySqlConnection(ConnectionString))
    6. {
    7. var p = new DynamicParameters();
    8. if(newColumn != null)
    9. {
    10. if (sortOrder == "" || sortOrder == "ASC")
    11. {
    12. sortOrder = "DESC";
    13. newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending;
    14. }
    15. else
    16. {
    17. sortOrder = "ASC";
    18. newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
    19. }
    20. }
    21. else
    22. {
    23. sortOrder = "ASC";
    24. newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
    25. }
    26. p.Add("p_sortData", dataprop);
    27. p.Add("p_sortOrder", sortOrder);
    28. dgvMitglied.DataSource = null;
    29. dgvMitglied.DataSource = connection.Query("sp_mMitgliedSelectAllOrderIDReverse", p, commandType: CommandType.StoredProcedure).ToList();
    30. }
    31. }

    Die Glyphen funktionieren nicht, aber ok, was solls, damit kann ich für den Moment leben.

    Beiträge zusammengefügt. ~Thunderbolt
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()