C#

2016-04-07 4 views
1

içindeki satırların sırasını değiştir DataTable'daki satırların sırasını değiştirmek mümkün mü, örneğin 5'in geçerli endeksi olan bir tanesi 3, vb.C#

Bu eski, karmaşık kodun, açılır menünün DataTable değerlerini almasını sağlayarak veri tabanındaki değerleri almasını sağlıyorum. Çok fazla sütun ve girişe sahip olduğu için veritabanında değişiklik yapmak imkansızdır. Orijinalim yine de db cinsinden yeni sütun eklemek ve değerlerine göre sıralamaktı, ama bu zor olacak.

Bu sadece kullanıcı sunumu meselesi olduğundan, sadece DataTable'daki satır sırasını değiştirmeyi düşünüyordum. Birisi C# için bunu yapmanın en iyi yolunu biliyor mu?

Bu benim geçerli kod: Ben satır 2011 itmek istiyor Örneğin

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 

    foreach (DataRow row in result.Rows) 
    { 
     m_cboReasonCode.Properties.Items.Add(row["FLOKKUR"].ToString().Trim() + " - " + row["SKYRING"]); 
    } 

- Daha önce DataTable'a üstüne çıkarılmış Kredi.

enter image description here

ÇÖZÜM:

DataRow firstSelectedRow = result.Rows[6]; 
DataRow firstNewRow = result.NewRow(); 
firstNewRow.ItemArray = firstSelectedRow.ItemArray; // copy data 
result.Rows.Remove(firstSelectedRow); 
result.Rows.InsertAt(firstNewRow, 0); 

Şu ana kadar: DataTable satırları sipariş ve değil eskimiş teknoloji ile çalışan ile ilgili sorunlar olabilir olanlar için

bu yardımcı olabilecek Linq destekler satırı klonlamak için, onu kaldırın ve yeni bir dizinle tekrar ekleyin. Bu kod, DataTable'da ilk sırada yer alan dizini 6 ile taşır.

+0

Gerçekten rastgele bir sipariş mi istiyorsunuz? Eğer öyleyse, sadece bir kez veya her zaman farklı? Bir sütun eklemek istediğinizden, siparişiniz için kullanmak istediğiniz bir iş mantığı var mı? –

+0

@TimSchmelter Merhaba Tim, sadece bir kez rastgele. Her zaman böyle olmak istiyorum. Basitçe kullanıcılar, bu açılır listenin en üstünde bulunan girişlerden bazılarına sahip olmak ister. (kullanıcı kullanıcı olacak) Başarıyla yapmaya çalıştığım şey hakkında daha fazla açıklama ile resim ekledim. –

+0

bu size yardımcı olabilir http://stackoverflow.com/questions/7801714/how-to-extract-10-random-rows-from-datatable –

cevap

0

Sen satırları sipariş linq kullanabilirsiniz:

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 

foreach (DataRow row in result.Rows.OrderBy(x => x.ColumnName)) 
{ 
    m_cboReasonCode.Properties.Items.Add(row["FLOKKUR"].ToString().Trim() + " - " + row["SKYRING"]); 
} 

birden çok sütuna göre sipariş etmek için:

result.Rows.OrderBy(x => (x.ColumnName == 2001 or x.ColumnName == 2002) ? 0 : 1).ThenBy(x => x.ColumName) 

Sen kullanabilirsiniz:

result.Rows.OrderBy(x => x.ColumnName).ThenBy(x => x.OtherColumnName).ThenBy(x.YetAnotherOne) 

belirli bir değere göre sipariş etmek için belirli satırları üst üste "sabitlemek" için yukarıdaki kod, daha ayrıntılı bir şekilde isterseniz, örneğin belirli bir sıralamak için bir anahtar kullanabilirsiniz 1, 2, 3, 4'ün sıralanmış değerlerine değer verir ve geri kalanı için daha yüksek bir sayı kullanır.

Sen sırasını değiştirmek ya da foreach döngüsünde bir satırını silemezsiniz
+1

"Rastgele" - –

+0

@lysp sorusuyla ilgilenmez. Bu, sütun adına göre sıralamak için bir sorun değil ... Ama şu sıralar bunu satır ile yapmam gerekiyor :( –

+0

"Rastgele" adresinden alınmıştır. Yanıtın belirli bir değeri bölümü (3. kod bloğu) – lysp

0

, yeni datatable satır eklemek rastgele yeni bir datatable oluşturmak ve gereken, ayrıca

0

kullanın a çoğaltmak için değil eklenen satırları izlemelisiniz DataView

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 
DateView view = new DateView(result); 
view.Sort = "FLOKKUR"; 
view.Filter = "... you can even apply an in memory filter here ..." 

foreach (DataRowView row in view.Rows) 
{ 
    .... 

Her veri tablosu kullanabileceğiniz bir bakış DefaultView, dataLayer içinde/filtreleme sıralama varsayılan uygulayabilirsiniz bu şekilde geliyor.Eğer gerçekten rasgelelik istiyorsanız

public DataTable GetMCCHABAKflokka(string tableName, string sort, string filter) 
{ 
    var result = GetMCCHABAKflokka(tableName); 
    result.DefaultView.Sort = sort; 
    result.DefaultView.Filter = filter; 
    return result; 
}  

// use like this 
foreach (DataRowView row in result.DefaultView) 
+0

DataTable öğesinin değişmediğini unutmayın.Görünüm sıralanır.Görüntüyü bir DataTable ile geri dönüştürebilirsiniz.DefaultView.ToTable() – CathalMF

0

Eğer LINQ en OrderBy yılında Guid.NewGuid kullanabilirsiniz: aslında rastgeleliğine istemiyorsanız

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 
var randomOrder = result.AsEnumerable().OrderBy(r => Guid.NewGuid()); 
foreach (DataRow row in randomOrder) 
{ 
    // ... 
} 

ama üst kısımda özel değerler istiyorsanız, kullanabilirsiniz:

var orderFlokkur2011 = result.AsEnumerable() 
    .OrderBy(r => r.Field<int>("FLOKKUR") == 2011 ? 0 : 1); 
+0

Muhtemelen didn ' iyi açıkladı soruyu değiştirmek zorunda olacak, tam bir rastgelelik istemiyorum, onları alışılmadık bir şekilde sıralamam gerekiyor, örneğin: endeksi 5 olan satır her zaman DataTable'ın en üstünde ve dizin iki ile satır indeksi 3, vb için değiştirilir, bu siparişi sadece bir kez yapmak gerekir ve bu nasıl kalmalıdır .... @TimSchmelter –

+0

İkinci yaklaşımımı gördünüz mü? –

+0

Sadece ekledim, ekledim DataTable için AsEnumerable ve OrderBy eksik, bunları almak için eklemek zorunda olduğum isim olabilir mi? Bunu yapamıyorum bile, bu WinForms kullanan süper eski bir yazılım olduğu için ... @TimSchmelter –