Jak zmienić kolejność kolumn DataTable
Jak zmienić kolejność kolumn w c#.
Przykład:
Am utworzony porządek typu tabeli SQL jest Qty, Unit, Id, ale w programie DataTable kolejność jest Id, Qty, Unit. W kodzie za am bezpośrednio przekazać dane do typu tabeli SQL więc kolejność tabeli jest inna.
DataTable columns are: `Id,Qty,Unit.` I want this to be: `Qty,Unit,Id`
Proszę o pomoc
5 answers
Spróbuj użyć DataColumn.Metoda SetOrdinal . Na przykład:
dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1);
Aktualizacja: ta odpowiedź otrzymała znacznie więcej uwagi niż się spodziewałem. Aby uniknąć nieporozumień i ułatwić korzystanie, postanowiłem stworzyć metodę rozszerzenia do porządkowania kolumn w DataTable:
Metoda rozszerzenia:
public static class DataTableExtensions
{
public static void SetColumnsOrder(this DataTable table, params String[] columnNames)
{
int columnIndex = 0;
foreach(var columnName in columnNames)
{
table.Columns[columnName].SetOrdinal(columnIndex);
columnIndex++;
}
}
}
Użycie:
table.SetColumnsOrder("Qty", "Unit", "Id");
Lub
table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 03:36:42
Jest to oparte na odpowiedzi "default locale", ale usunie nieprawidłowe nazwy kolumn przed ustawieniem kolejności. Dzieje się tak, ponieważ jeśli przypadkowo wyślesz nieprawidłową nazwę kolumny, to zawiedzie, a jeśli umieścisz czek, aby zapobiec jej niepowodzeniu, indeks będzie nieprawidłowy, ponieważ pominie indeksy wszędzie tam, gdzie została przekazana Nieprawidłowa nazwa kolumny.
public static class DataTableExtensions
{
/// <summary>
/// SetOrdinal of DataTable columns based on the index of the columnNames array. Removes invalid column names first.
/// </summary>
/// <param name="table"></param>
/// <param name="columnNames"></param>
/// <remarks> http://stackoverflow.com/questions/3757997/how-to-change-datatable-colums-order</remarks>
public static void SetColumnsOrder(this DataTable dtbl, params String[] columnNames)
{
List<string> listColNames = columnNames.ToList();
//Remove invalid column names.
foreach (string colName in columnNames)
{
if (!dtbl.Columns.Contains(colName))
{
listColNames.Remove(colName);
}
}
foreach (string colName in listColNames)
{
dtbl.Columns[colName].SetOrdinal(listColNames.IndexOf(colName));
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 16:40:24
Wiem, że to naprawdę stare pytanie.. i wygląda na to, że zostało to odebrane.. Ale dotarłem tu z tym samym pytaniem, ale z innym powodem pytania, więc trochę inna odpowiedź mi pomogła. Mam ładny generyczny datagridview wielokrotnego użytku, który pobiera źródło danych dostarczone do niego i po prostu wyświetla kolumny w ich domyślnej kolejności. Umieszczam aliasy i kolejność kolumn oraz wybór na poziomie tableadapter zbioru danych w designer. Jednak zmiana kolejności zapytań select kolumn wydaje się, że nie ma wpływu na kolumny zwrócone przez zestaw danych. Znalazłem jedyny sposób, aby to zrobić w Projektancie, jest usunięcie wszystkich kolumn zaznaczonych w tableadapter, dodając je z powrotem w kolejności, w jakiej chcesz je wybrane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 14:26:06
Możesz również użyć:
dataview v=dt.defaultview; // ( dt datatable)
v.sort="columnName ASC"; // ASC / DESC for ascending / descending order
dt=v.toTable();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 08:52:53
Możemy użyć tej metody do zmiany indeksu kolumn, ale powinna być zastosowana do wszystkich kolumn jeżeli jest więcej niż dwie liczby kolumn, w przeciwnym razie wyświetli się wszystkie niewłaściwe wartości z tabeli danych....................
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 07:09:56