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 http://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: http://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;
			}
		}
	}
}

Über Björn Karpenstein

Programmierer, Musiker, Komponist
Dieser Beitrag wurde unter .NET, C# veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

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