Bagaimana mengubah urutan kolom DataTable

92

Bagaimana mengubah urutan kolom Datatable di c #.

Contoh:

Saya membuat urutan tipe tabel sql adalah Qty, Unit, Id tetapi dalam urutan program DataTable adalah Id, Qty, Unit. Dalam kode Di Belakang saya langsung meneruskan DataTable ke tipe tabel sql sehingga urutan tabelnya berbeda.

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 

Tolong bantu

Vyasdev Meledath
sumber
1
dapatkah Anda menjelaskan mengapa Anda ingin mengubah urutan kolom?
KBoek
Saya membuat urutan tipe tabel sql Qty,Unit,Id tetapi dalam urutan program DataTable adalah Id,Qty,Unit. Pada code Behind, saya langsung mengoper DataTable ke tipe tabel sql sehingga urutan tabelnya berbeda. Itulah mengapa saya ditanya "bagaimana cara mengubah urutan kolom?"
Vyasdev Meledath
6
Jawab saja OP sudah.
Christian

Jawaban:

233

Coba gunakan metode DataColumn.SetOrdinal . Sebagai contoh:

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 

UPDATE: Jawaban ini mendapat perhatian lebih dari yang saya harapkan. Untuk menghindari kebingungan dan membuatnya lebih mudah digunakan, saya memutuskan untuk membuat metode ekstensi untuk pengurutan kolom di DataTable:

Metode ekstensi:

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

Pemakaian:

table.SetColumnsOrder("Qty", "Unit", "Id");

atau

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
lokal default
sumber
dengan memberi seperti yang Anda katakan, struktur tabel berubah menjadi saja. Qty,Id,Unit Saya ingin seperti ini Qty,Unit,Id.
Vyasdev Meledath
Tentu, Anda harus menggunakan metode ini untuk semua kolom kecuali yang terakhir.
lokal default
4
metode yang lebih baik body: var colIndex = 0; foreach (var colName di columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan
@JoelFan Saya telah memperbarui jawaban saya, terima kasih! Kode Anda pasti terlihat lebih bersih.
lokasi default
1
sangat membantu, tnx.
jonathana
6

Ini didasarkan pada jawaban "default locale" tetapi akan menghapus nama kolom yang tidak valid sebelum menyetel ordinal. Ini karena jika Anda secara tidak sengaja mengirim nama kolom yang tidak valid maka itu akan gagal dan jika Anda memberi tanda centang untuk mencegahnya gagal maka indeks akan salah karena akan melewatkan indeks di mana pun nama kolom yang tidak valid diteruskan.

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));
        }
}
Soenhay
sumber
2

Saya tahu ini adalah pertanyaan yang sangat lama .. dan tampaknya telah dijawab .. Tetapi saya sampai di sini dengan pertanyaan yang sama tetapi alasan yang berbeda untuk pertanyaan itu, dan jawaban yang sedikit berbeda berhasil untuk saya. Saya memiliki datagridview generik yang bagus dan dapat digunakan kembali yang mengambil sumber data yang disediakan untuk itu dan hanya menampilkan kolom dalam urutan defaultnya. Saya menempatkan alias dan urutan kolom dan seleksi pada tingkat tabel adaptor set data di desainer. Namun mengubah urutan kueri pemilihan kolom tampaknya tidak memengaruhi kolom yang dikembalikan melalui kumpulan data. Saya telah menemukan satu-satunya cara untuk melakukan ini pada desainer, adalah dengan menghapus semua kolom yang dipilih di dalam tableadapter, menambahkannya kembali dalam urutan yang Anda inginkan.

da Bich
sumber
1

Jika Anda memiliki lebih dari 2-3 kolom, SetOrdinaladalah tidak cara untuk pergi. Metode DataView ToTablemenerima larik parameter nama kolom. Pesan kolom Anda di sana:

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
Brent McKain
sumber
0

Kita dapat menggunakan metode ini untuk mengubah indeks kolom tetapi harus diterapkan ke semua kolom jika ada lebih dari dua jumlah kolom jika tidak maka akan menampilkan semua nilai yang tidak benar dari tabel data ............ ........

santosh
sumber
-3

Re-Ordering data Tabel berdasarkan beberapa kondisi atau kotak centang dicentang. PFB: -

 var tableResult= $('#exampleTable').DataTable();

    var $tr = $(this).closest('tr');
    if ($("#chkBoxId").prop("checked")) 
                    {
                        // re-draw table shorting based on condition
                        tableResult.row($tr).invalidate().order([colindx, 'asc']).draw();
                    }
                    else {
                        tableResult.row($tr).invalidate().order([colindx, "asc"]).draw();
                    }
satya prakash
sumber
Harap baca pertanyaan dengan cermat. Query di atas adalah untuk c # bukan untuk jquery
Ahmad Mukhtar
1
Tidak hanya jawaban ini untuk bahasa yang salah, pertanyaannya adalah untuk mengurutkan kolom bukan mengurutkan baris. Bagaimana Anda sampai pada jawaban ini, apalagi lebih dari 8 tahun setelah jawaban yang diterima? Mengapa?
jreed121