2010-09-21 54 views
65

Cách thay đổi thứ tự cột có thể định sẵn trong C#.Cách thay đổi thứ tự cột DataTable

Ví dụ:

sáng tạo sql loại bảng thứ tự là Số lượng, Đơn vị, Id nhưng trong chương trình để DataTable là Id, Số lượng, Đơn vị. Trong mã Đằng sau am trực tiếp vượt qua DataTable để loại bảng sql để thứ tự bảng là khác nhau.

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

Xin giúp

+3

Đây là thêm một tính năng giao diện người dùng mà bạn có thể thay đổi bằng cách định nghĩa các cột lưới isnt'it? –

+1

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

+0

sáng tạo thứ tự bảng loại sql là 'Số lượng, Đơn vị, Id' nhưng trong chương trình thứ tự DataTable là' Id, Số lượng, Đơn vị'.Trong mã Đằng sau sáng trực tiếp vượt qua DataTable để loại bảng sql để thứ tự bảng là khác nhau. Đó là lý do tại sao được hỏi "làm thế nào để thay đổi thứ tự cột?" –

Trả lời

158

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

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

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

phương pháp 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++; 
     } 
    } 
} 

Cách sử dụng:

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

hoặc

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

bằng cách đưa ra như bạn đã nói, cấu trúc bảng đã thay đổi thành 'Chỉ số Q, Id, Đơn vị'. Tôi muốn có 'Số, Đơn vị, Id' này. –

+0

Ofc, 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. –

+1

thân phương pháp tốt hơn: var colIndex = 0; foreach (var colName trong cộtNames) table.Columns [colName] .SetOrdinal (colIndex ++); – JoelFan

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 được á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 đúng từ bảng dữ liệu .......... ..........

6

Điều này dựa trên câu trả lời "ngôn ngữ mặc định" nhưng sẽ xóa 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ẽ thất bại và nếu bạn đặt một dấu kiểm để ngăn không cho nó thất bại thì chỉ mục sẽ sai vì nó sẽ bỏ qua các chỉ mục ở bất cứ nơi nào một tên cột không hợp lệ được truyề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)); 
     } 
} 
1

Tôi biết đây là một câu hỏi thực sự cũ .. và nó xuất hiện nó đã được trả lời .. Nhưng tôi đã ở đây với cùng một câu hỏi nhưng một lý do khác nhau cho câu hỏi, và do đó, một câu trả lời hơi khác nhau làm việc cho tôi. Tôi có một datagridview chung tái sử dụng tốt đẹp mà lấy nguồn dữ liệu 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 độ tableadapter của bộ dữ liệu trong thiết kế. Tuy nhiên việc thay đổi thứ tự truy vấn chọn các cột dường như không ảnh hưởng đến các cột được trả lại 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 nhà thiết kế, là xóa tất cả các cột được chọn trong tableadapter, thêm chúng trở lại theo thứ tự bạn muốn chúng được chọn.

Các vấn đề liên quan