Ok, ja po prostu bita to się bardzo szybko, a nie robić wszystko neccessary obsługę błędów i sprawdzanie wartości null, ale powinno dać wyobrażenie i powinny być enou gh możesz zacząć:
public static class DataTableExtensions
{
public static DataView ApplySort(this DataTable table, Comparison<DataRow> comparison)
{
DataTable clone = table.Clone();
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
rows.Add(row);
}
rows.Sort(comparison);
foreach (DataRow row in rows)
{
clone.Rows.Add(row.ItemArray);
}
return clone.DefaultView;
}
}
Zastosowanie:
DataTable table = new DataTable();
table.Columns.Add("IntValue", typeof(int));
table.Columns.Add("StringValue");
table.Rows.Add(11, "Eleven");
table.Rows.Add(14, "Fourteen");
table.Rows.Add(10, "Ten");
table.Rows.Add(12, "Twelve");
table.Rows.Add(13, "Thirteen");
// Sortuj według StringValue:
DataView sorted = table.ApplySort((r, r2) =>
{
return ((string)r["StringValue"]).CompareTo(((string)r2["StringValue"]));
});
Wynik:
11 Jedenaście
14 Czternaście
10 Dziesięć
13 Trzynaście
12 Dwunastu
// Sortuj według intValue:
DataView sorted = table.ApplySort((r, r2) =>
{
return ((int)r["IntValue"]).CompareTo(((int)r2["IntValue"]));
});
Wynik:
10 Dziesięć
11 Jedenaście
13 Trzynaście
12 Dwunastu
14 Czternaście
EDIT: Zmieniono go metodę rozszerzenia.
Teraz w Twojej Lambda (lub można stworzyć pełnowartościowy metodę porównania) można zrobić wszelkiego rodzaju niestandardowych logiki sortowania, które potrzebujesz. Pamiętaj, że -1 jest mniejsze niż, 0 jest równe, a 1 jest większe niż.
Jestem ci winien piwo. – Orestes
Świetna odpowiedź. Potrzebowałem tylko odrobiny ulepszenia w odniesieniu do dwukierunkowego sortowania i wiązania widoku z powrotem do siatki. – tys