Cách thay đổi thứ tự cột DataTable


91

Cách thay đổi thứ tự cột có thể định dạng trong c #.

Thí dụ:

am tạo thứ tự loại bảng sql là Qty, Unit, Id nhưng trong chương trình DataTable thứ tự là Id, Qty, Unit. Trong đoạn mã Behind am trực tiếp truyền DataTable sang kiểu bảng sql nên thứ tự bảng khác nhau.

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

Xin vui lòng giúp đỡ


1
bạn có thể giải thích lý do tại sao bạn muốn thay đổi thứ tự cột không?
KBoek

am tạo thứ tự bảng sql là Qty,Unit,Id nhưng trong chương trình DataTable thứ tự là Id,Qty,Unit. Trong mã Phía sau tôi chuyển trực tiếp DataTable sang kiểu bảng sql nên thứ tự bảng khác nhau.
Vyasdev Meledath

6
Chỉ cần trả lời OP đã.
Christian

Câu trả lời:


232

Cố gắng sử dụng phương pháp DataColumn.SetOrdinal . Ví dụ:

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

CẬP NHẬT: Câu trả lời này nhận được nhiều sự chú ý hơn tôi mong đợi. Để tránh nhầm lẫn và dễ sử dụng hơn, tôi đã quyết định tạo một phương thức mở rộng để sắp xếp cột trong DataTable:

Phương thức mở rộng:

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

Sử dụng:

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

hoặc là

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});

bằng cách đưa ra như bạn đã nói, cấu trúc bảng đã thay đổi thành Qty,Id,Unit only Tôi muốn như thế này Qty,Unit,Id.
Vyasdev Meledath

Tất nhiên, bạn nên sử dụng phương pháp này cho tất cả các cột ngoại trừ cột cuối cùng.
ngôn ngữ mặc định

4
phần thân phương thức tốt hơn: var colIndex = 0; foreach (var colName in columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan

@JoelFan Tôi đã cập nhật câu trả lời của mình, cảm ơn bạn! Mã của bạn chắc chắn trông sạch sẽ hơn.
ngôn ngữ mặc định

1
rất hữu ích, tnx.
jonathana

6

Điều này dựa trên câu trả lời của "ngôn ngữ mặc định" nhưng nó sẽ loại bỏ các tên cột không hợp lệ trước khi đặt thứ tự. Điều này là do nếu bạn vô tình gửi một tên cột không hợp lệ thì nó sẽ không thành công và nếu bạn kiểm tra để ngăn nó không thành công thì chỉ mục sẽ sai vì nó sẽ bỏ qua các chỉ mục ở bất cứ nơi nào tên cột không hợp lệ được chuyển vào.

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

2

Tôi biết đây là một câu hỏi thực sự cũ .. và có vẻ như nó đã được trả lời .. Nhưng tôi đến đây với cùng một câu hỏi nhưng một lý do khác cho câu hỏi, và vì vậy một câu trả lời hơi khác đã phù hợp với tôi. Tôi có một chế độ xem dữ liệu chung chung có thể tái sử dụng rất hay, lấy nguồn dữ liệu được cung cấp cho nó và chỉ hiển thị các cột theo thứ tự mặc định của chúng. Tôi đặt bí danh và thứ tự cột và lựa chọn ở cấp bộ dữ liệu bảng trong trình thiết kế. Tuy nhiên, việc thay đổi thứ tự truy vấn chọn của các cột dường như không ảnh hưởng đến các cột được trả về thông qua tập dữ liệu. Tôi đã tìm thấy cách duy nhất để làm điều này trong trình thiết kế, là loại bỏ tất cả các cột được chọn trong bộ sơ đồ bảng, thêm chúng trở lại theo thứ tự bạn muốn chúng đã chọn.


1

Nếu bạn có nhiều hơn 2-3 cột, SetOrdinalkhông con đường để đi. ToTablePhương thức của DataView chấp nhận một mảng tham số tên cột. Đặt hàng các cột của bạn ở đó:

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

0

Chúng ta có thể sử dụng phương pháp này để thay đổi chỉ mục cột nhưng nên áp dụng cho tất cả các cột nếu có nhiều hơn hai số cột nếu không nó sẽ hiển thị tất cả các giá trị Không phù hợp từ bảng dữ liệu ............ ........


-3

Dữ liệu đặt hàng lại Bảng dựa trên một số điều kiện hoặc hộp kiểm được chọn. 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();
                    }

Vui lòng đọc kỹ câu hỏi. Truy vấn trên là dành cho c # không cho jquery
Ahmad Mukhtar

1
Không chỉ câu trả lời này là sai ngôn ngữ, câu hỏi còn là sắp xếp các cột chứ không phải sắp xếp các hàng. Làm thế nào bạn đi đến câu trả lời này, hãy để một mình hơn 8 năm sau khi câu trả lời được chấp nhận? Tại sao?
jreed121
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.