2009-08-05 22 views
12

'daki tüm işaretli onay kutularını işaretleyin İçerdiği10 satırlarının seçili/işaretli olup olmadığını bulmak için aşağıdaki GridView satırları arasında yinelenen geçerli algoritmayı göz önünde bulundurun.LINQ: Bir GridView

List<int> checkedIDs = new List<int>(); 

foreach (GridViewRow msgRow in messagesGrid.Rows) 
{ 
    CheckBox chk = (CheckBox)msgRow.FindControl("chkUpdateStatus"); 
    if (chk.Checked){ 
    //we want the GridViewRow's DataKey value 
    checkedMsgIDs.Add(int.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString())); 
    } 
} 

Bu beklendiği gibi çalışır: Tamamen List<int> nüfuslu kalacaksın.

Soru: siz veya verebilir olacağını nasıl yeniden yazma veya sahip tüm satırlar için GridView aramak için LINQ kullanarak bu algoritmayı geliştirmek onların Checkbox seçilmiş/kontrol?

cevap

20

Bunu herhangi performans artışı elde etmek gitmiyoruz eminim, ama bu biraz kolay okumak için hale getirebileceğini:

var checkedIDs = from GridViewRow msgRow in messagesGrid.Rows 
       where ((CheckBox)msgRow.FindControl("chkUpdateStatus")).Checked 
       select Int32.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString()); 

Yine, emin değilim bu bir fark yaratıyor. Ayrıca, neden bir dizeye ve sonra bir int'ye dönüştürüyorsunuz? Convert.ToInt32'un yapamayacağı bir şey var mı?

+0

Teşekkürler LC! Convert.ToInt32'nin iyi çalışması gerekir. Bu geliştirme için de teşekkürler! –

+0

Bu aptalca gelebilir ancak 'System.Linq;' kullandığınızdan emin olun. Bu ifadeyi yazmadan önce yerinde. Ben şikayetçi olmadan tüm Linq şeyler yazmak mümkün oldu ancak (ben GridViewRow msgRow gelen) kapalı cast yapmaya çalıştığında derleyici GridViewRowCollection 'Cast' için bir tanım hakkında şikayet ve Intelli-anlamda bana hiçbir şey söyledi Kullanmaya ihtiyacım vardı. – ammills01

9

Ben Satırlar onlar olmayabilir IEnumerable olup olmadığından emin değilim, ama onlar

List<int> checkedIDs = messagesGrid.Rows 
    .Where<GridViewRow>(i => (CheckBox)i.FindControl("chkUpdateStatus").Checked) 
    .Select<GridViewRow, int>(i => return int.Parse(messagesGrid.DataKeys[i.RowIndex].Value.ToString())) 
    .ToList<int>(); 

Sadece not defteri içinde bunu varsayıyorum gidiyorum, orada bir derleme hatası olabilir. Ama Linq ile aynı şeyi böyle yapabilirsin.

+0

Evet, benimkiyle aynı gibi görünüyor, ancak yöntem sözdiziminde ve sonunda bir "ToList" ile (ve açık jenerik tür belirticiler). –

+0

Evet, gördüm. Metodun sözdizimini beğendim, sadece temiz görünüyor. –

+1

Bu yazılmamış IEnumerable (.NET 4.0'dan itibaren). Rows.OfType () .Where() ... 'yapmak istersiniz. –

4

Benzer bir şey var ama birden fazla yerde kullanıyordum, bu yüzden bir uzantı yöntemi oluşturdum.

public static void ActOnCheckedRows(this GridView gridView, string checkBoxId, Action<IEnumerable<int>> action) 
{ 
    var checkedRows = from GridViewRow msgRow in gridView.Rows 
        where ((CheckBox)msgRow.FindControl(checkBoxId)).Checked 
        select (int) gridView.DataKeys[msgRow.RowIndex].Value; 

    action(checkedRows); 
} 

Şimdi tüm işaretli satırlarla bir şeyler yapabilirim. Derleyici, türlerin çıkarılmasında oldukça iyidir, ancak bazen IENumerable türü olarak checkedRows'u açıkça belirtmem gerekir.

gvTasksToBill.ActOnCheckedRows("RowLevelCheckBox", checkedRows => 
{ 
    foreach (int id in checkedRows) 
    { 
     // do something with id 
    } 
});