Problem
Ein vorsortiertes asp:GridView (Screenshot: Original) soll nach einer Spalte (Screenshot Algorithmus 1) oder nach identischem Inhalt (Screenshot Algorithmus 2) sortiert werden.
Prämisse / Vorraussetzungen
- Das GridView sollte vorher (z.B. mit ORDER BY-Klausel) vorsortiert werden um die bestmöglichen Ergebnisse zu erzielen.
- Wenn nach einer Spalte gruppiert wird, sollte diese Spalte erstrangig (also erste Erwähnung in ORDER BY-Klausel) stattfinden.
Ansatz – Approach
- Erschaffung eines Algorithmus, welcher über die RowSpan-Eigenschaft Zellen miteinander verbindet.
- Vergleich ob der Text der Vorgängerspalte der gleiche ist
- JA:
- Unsichtbarschalten der aktuellen Zeilen
- inkrement des RowSpan-Wertes der Vorgängerzeile
- Vorgängerzeile ist nun die einzig Sichtbare
- Nein: Weitermachen
- JA:
Lösung – Solution
Vorgehensweise
1.) Auf das GridView klicken
2.) Im Objekt-Inspektor auf „Events/Ereignisse“ (also der Blitz) klicken
3.) Doppelklick auf das Ereignis „OnDataBound“
4.) in die erzeugte Methode kann der folgende Code kopiert werden
Algorithmus 1: GridView-Gruppierung nach einer Spalte
/**************************************** * ASP:GridView Grouping Algorithmus * Quelle https://www.capri-soft.de/blog ****************************************/ // Nach dieser Spalte soll gruppiert werden int k = 1; // Für alle Zeilen (VON UNTEN NACH OBEN) for (int i = GridView1.Rows.Count - 1; i > 0; i--) { GridViewRow row = GridView1.Rows[i]; GridViewRow previousRow = GridView1.Rows[i - 1]; // Für alle Spalten for (int j = 0; j < row.Cells.Count; j++) { if ((row.Cells[k].Text == previousRow.Cells[k].Text) && (row.Cells[j].Text == previousRow.Cells[j].Text)) { if (previousRow.Cells[j].RowSpan == 0) { if (row.Cells[j].RowSpan == 0) { previousRow.Cells[j].RowSpan += 2; } else { previousRow.Cells[j].RowSpan = row.Cells[j].RowSpan + 1; } row.Cells[j].Visible = false; } } } }
Algorithmus 2: GridView-Gruppierung für alle identischen Zellen einer GridView-Spalte
/**************************************** * asp:GridView Grouping Algorithmus * Quelle: https://www.capri-soft.de/blog ****************************************/ // Für alle Zeilen (VON UNTEN NACH OBEN) for (int i = GridView1.Rows.Count - 1; i > 0; i--) { GridViewRow row = GridView1.Rows[i]; GridViewRow previousRow = GridView1.Rows[i - 1]; // Für alle Spalten for (int j = 0; j < row.Cells.Count; j++) { if (row.Cells[j].Text == previousRow.Cells[j].Text) { if (previousRow.Cells[j].RowSpan == 0) { if (row.Cells[j].RowSpan == 0) { previousRow.Cells[j].RowSpan += 2; } else { previousRow.Cells[j].RowSpan = row.Cells[j].RowSpan + 1; } row.Cells[j].Visible = false; } } } }