Hi Leute,
die Aufgabe bestand darin, bei mehreren sehr ähnlichen Forms mit DGVs die Daten nach mehreren Kriterien zu sortieren.
Es genügen hier einfache DataTables mit String-Spalten, da die Daten lediglich anzuzeigen waren.
Die Formatierung der Daten wird gleich bei der Befüllung vorgenommen.
Ich war auf der Suche nach einem einfachen Code, der für diese Belange ausreichte.
Mit Anleihen bei Microsoft:
msdn.microsoft.com/de-de/libra…ang=csharp#code-snippet-2
docs.microsoft.com/de-de/dotne…orms-datagridview-control
kam dann dieser Code heraus (Form mit einem
Spoiler anzeigen
Zum Sortieren wird das
Die zu sortierende
--------------
Die Testdaten sind so angelegt, dass immer die jeweils nächste Spalte die nächste Ordnung darstellt (0 - 1 - 2 - 3 - 0 - ...):
die Aufgabe bestand darin, bei mehreren sehr ähnlichen Forms mit DGVs die Daten nach mehreren Kriterien zu sortieren.
Es genügen hier einfache DataTables mit String-Spalten, da die Daten lediglich anzuzeigen waren.
Die Formatierung der Daten wird gleich bei der Befüllung vorgenommen.
Ich war auf der Suche nach einem einfachen Code, der für diese Belange ausreichte.
Mit Anleihen bei Microsoft:
msdn.microsoft.com/de-de/libra…ang=csharp#code-snippet-2
docs.microsoft.com/de-de/dotne…orms-datagridview-control
kam dann dieser Code heraus (Form mit einem
DataGridView
):C#-Quellcode
- using System;
- using System.Data;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form1 : Form
- {
- private DataTable Table;
- public Form1()
- {
- this.InitializeComponent();
- // damit C&P funktioniert
- this.dataGridView1.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView1_ColumnHeaderMouseClick);
- this.Table = new DataTable("Sort");
- // Add four columns
- this.Table.Columns.Add("Col 1");
- this.Table.Columns.Add("Col 2");
- this.Table.Columns.Add("Col 3");
- this.Table.Columns.Add("Col 4");
- // Add data
- this.Table.Rows.Add("²²", "mm", "##", "++");
- this.Table.Rows.Add("²²", "mm", "##", "--");
- this.Table.Rows.Add("²²", "mm", "@@", "++");
- this.Table.Rows.Add("²²", "mm", "@@", "--");
- this.Table.Rows.Add("²²", "xx", "##", "++");
- this.Table.Rows.Add("²²", "xx", "##", "--");
- this.Table.Rows.Add("²²", "xx", "@@", "++");
- this.Table.Rows.Add("²²", "xx", "@@", "--");
- this.Table.Rows.Add("oo", "mm", "##", "++");
- this.Table.Rows.Add("oo", "mm", "##", "--");
- this.Table.Rows.Add("oo", "mm", "@@", "++");
- this.Table.Rows.Add("oo", "mm", "@@", "--");
- this.Table.Rows.Add("oo", "xx", "##", "++");
- this.Table.Rows.Add("oo", "xx", "##", "--");
- this.Table.Rows.Add("oo", "xx", "@@", "++");
- this.Table.Rows.Add("oo", "xx", "@@", "--");
- this.Table.AcceptChanges();
- this.dataGridView1.DataSource = this.Table;
- // Spaltennamen explizit überschreiben
- this.dataGridView1.Columns[0].HeaderText = "Spalte 1";
- this.dataGridView1.Columns[1].HeaderText = "Spalte 2";
- this.dataGridView1.Columns[2].HeaderText = "Spalte 3";
- this.dataGridView1.Columns[3].HeaderText = "Spalte 4";
- }
- private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
- {
- // Primär-Spalte
- int index = e.ColumnIndex;
- // Array, in dem die Reihenfolge der nachgeordneten Spalten festgelegt wird
- int[] sortOrder;
- switch (index)
- {
- case 0: // => default
- sortOrder = new int[] { 0, 1, 2, 3 };
- break;
- case 1:
- sortOrder = new int[] { 1, 2, 3, 0 };
- break;
- case 2:
- sortOrder = new int[] { 2, 3, 0, 1 };
- break;
- case 3:
- sortOrder = new int[] { 3, 0, 1, 2 };
- break;
- default:
- // Weitere Spalten: keine weiteren Kriterien
- sortOrder = new int[] { index };
- break;
- }
- // der erste Wert muss die selektierte Spalte sein
- System.Diagnostics.Debug.Assert(sortOrder != null && index == sortOrder[0], "Array falsch befüllt");
- Form1.OrderTable(this.dataGridView1, sortOrder);
- }
- /// <summary>
- /// Sortierung der DataTable eines DataGridView
- /// nach mehereren Kriterien
- /// </summary>
- /// <param name="dgv">das DataGridView</param>
- /// <param name="sortOrder">Reihenfolge der Kriterien</param>
- private static void OrderTable(DataGridView dgv, int[] sortOrder)
- {
- DataTable table = dgv.DataSource as DataTable;
- string order = Form1.GetOrderString(dgv, sortOrder[0]); // "ASC", "DESC"
- string sort = Form1.GetSortString(table, sortOrder, order); // "Color1 ASC, State ASC"
- Form1.Sort(table, sort);
- }
- /// <summary>
- /// Generieren des eigentlichen Sort-Strings
- /// </summary>
- /// <param name="table">Tabelle mit den Spaltennamen</param>
- /// <param name="sortOrder">Sortierabhängigkeit der Spalten untereinander</param>
- /// <param name="order">Sortierrichtung</param>
- /// <returns>der Sort-String</returns>
- private static string GetSortString(DataTable table, int[] sortOrder, string order)
- {
- // Spaltennamen in der Tabelle
- string sortString = string.Empty;
- // Länge begrenzen
- for (int i = 0; i < Math.Min(sortOrder.Length, table.Columns.Count); i++)
- {
- int elem = sortOrder[i];
- string name = table.Columns[elem].ColumnName;
- if (i < sortOrder.Length - 1)
- {
- sortString += string.Format("{0} {1}, ", name, order);
- }
- else
- {
- // der letzte String anders
- sortString += string.Format("{0} {1}", name, order);
- }
- }
- return sortString;
- }
- /// <summary>
- /// Generierung des Order-Strings anhand des DGV und des Spaltenindex'
- /// </summary>
- /// <param name="dgv">das zu sortierende DGV</param>
- /// <param name="index">der Spaltenindex</param>
- /// <returns>der Order-String</returns>
- private static string GetOrderString(DataGridView dgv, int index)
- {
- DataGridViewColumn oldColumn = dgv.SortedColumn;
- DataGridViewColumn newColumn = dgv.Columns[index];
- if (oldColumn == newColumn && dgv.SortOrder == SortOrder.Ascending)
- {
- // Sort the same column again, reversing the SortOrder.
- return "DESC";
- }
- // If oldColumn is null, then the DataGridView is not currently sorted.
- // Sort a new column
- return "ASC";
- }
- /// <summary>
- /// Sortieren einer DataTable
- /// </summary>
- /// <param name="table">die zu sortierende DataTable</param>
- /// <param name="sort">der Sort-String</param>
- private static void Sort(DataTable table, string sort)
- {
- // Create DataView
- DataView view = new DataView(table);
- // Sort DataView
- view.Sort = sort;
- // separate Instanz erforderlich, sonst ist die mit Clear() Tabelle weg
- DataTable table2 = view.ToTable();
- // Merge the sorted Table
- table.Clear();
- table.Merge(table2);
- table.AcceptChanges();
- }
- }
- }
DataGridView
übergeben, um die letzte Sortierung auslesen zu können, so dass sich das Sortrieren wie das übliche Sortieren verhält.Die zu sortierende
DataTable
wird als DataSource
aus dem DataGridView
ausgelesen.--------------
Die Testdaten sind so angelegt, dass immer die jeweils nächste Spalte die nächste Ordnung darstellt (0 - 1 - 2 - 3 - 0 - ...):
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!
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!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ () aus folgendem Grund: Daten für zyklische Tauschung eingefügt