ASP.NET asp:GridView gruppieren von identischen Spalten oder nach einer bestimmten Spalte / grouping identical GridView Rows/Cells or by column

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

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.