2010-09-21 25 views
65

Veritabanları sütun sırasını nasıl değiştirebilirim?DataTable sütunları nasıl değiştirilir? Sipariş

Örnek:

am oluşturulan sql tablo tipi sırası Adet, Birim, İd ama programda DataTable düzen Kimliği, Adet, Birim olduğunu. Kodda Behind doğrudan tablo sipariş farklı olduğundan, DataTable sql tablo tipine geçiriyorum.

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

DataColumn.SetOrdinal yöntemi kullanmak

+3

Bu daha çok sen ızgara sütunları isnt'it tanımlayarak değiştirebileceğiniz bir UI özelliği alınan? –

+1

, sütun sırasını neden değiştirmek istediğinizi açıklayabilir misiniz? – KBoek

+0

am oluştur sql tablo türü sipariş 'Adet, Birim, Kimlik ', ancak program DataTable sipariş' Id, Adet, Birim' dir.Geri Bildirim Ver Neden Behind Behind doğrudan sql tablo türünü sql tablo türü geçirirsiniz, böylece tablo sırası farklıdır. Neden "sütun düzeni nasıl değiştirilir?" –

cevap

158

deneyin yardımcı olun. Örneğin:

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

GÜNCELLEME: Bu cevap beklediğimden çok daha fazla ilgi gördü. Karışıklığı önlemek ve kullanımını kolaylaştırmak için ben DataTable sütun sipariş için bir uzantısı yöntemi oluşturmaya karar:

Uzatma yöntemi:

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

Kullanımı:

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

veya

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

anlattıkça, tablo yapısı "Adet, Kimlik, Birim" olarak değiştirildi. Bu gibi istiyorum "Adet, Birim, Kimlik". –

+0

Ofc, sonuncu hariç tüm sütunlar için bu yöntemi kullanmalısınız. –

+1

daha iyi bir yöntem gövdesi: var colIndex = 0; foreach (columnNames'te var colName) table.Columns [colName] .SetOrdinal (colIndex ++); – JoelFan

0

Sütun dizinini değiştirmek için bu yöntemi kullanabiliriz, ancak iki sütundan daha fazla sayıda sütun varsa tüm sütunlara uygulanmalıdır aksi halde veri tablosundaki tüm Uygun değerler gösterilecektir .......... ..........

6

Bu, "varsayılan yerel ayar" ın yanıtını temel alır, ancak sıralı olarak ayarlamadan önce geçersiz sütun adlarını kaldırır. Yanlışlıkla geçersiz bir sütun adı gönderirseniz, başarısız olur ve başarısız olmasını önlemek için bir denetim koyarsanız, geçersiz bir sütun adının geçtiği yerlerde dizinleri atlayacağından dizin yanlış olur.

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

Bunun gerçekten eski bir soru olduğunu biliyorum ... ve cevaplandığını göründü .. Ama burada aynı soruyla ama bu sorunun farklı bir sebebi var ve bu yüzden biraz farklı bir cevap benim için çalıştı. Ürünle birlikte verilen veri kaynağını alan ve yalnızca sütunları varsayılan sırayla görüntüleyen güzel, yeniden kullanılabilir genel bir datagridview var. Takma adlar ve sütun sırasını ve seçimini tasarımcıdaki veri kümesi tableadapter seviyesine koyarım. Ancak, sütunların seçim sorgusu sırasını değiştirmek, veri kümesinden döndürülen sütunları etkilemiyor gibi görünmüyor. Tasarımcıda bunu yapmanın tek yolunu buldum, tableadapter içinde seçilen tüm sütunları kaldırmak, onları istediğiniz sıraya geri eklemek.