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;
}
}
}
}
