LINQ: найти все отмеченные флажки в GridView - PullRequest
12 голосов
/ 05 августа 2009

Рассмотрим текущий алгоритм, приведенный ниже, который перебирает строки GridView, чтобы определить, выбран ли Checkbox выбран / проверен.

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

Это работает, как и ожидалось: у вас есть полностью заполненный List<int>.

Вопрос : Как бы вы или могли бы переписать или улучшить этот алгоритм, используя LINQ для поиска в GridView всех строк, для которых Checkbox выбран / отмечен?

Ответы [ 3 ]

20 голосов
/ 05 августа 2009

Я почти уверен, что от этого не получится улучшить производительность, но это может сделать немного более легким для чтения:

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

Опять же, не уверен, что это имеет значение. Кроме того, почему вы конвертируете в строку, а затем в int? Есть ли что-то, что Convert.ToInt32 не может сделать для вас?

9 голосов
/ 05 августа 2009

Я не уверен, что если строк много, их может и не быть, но я собираюсь предположить, что они

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

Я только что сделал это в блокноте, там может быть ошибка компиляции. Но вот как вы могли бы сделать то же самое с Linq.

4 голосов
/ 11 февраля 2010

У меня есть что-то похожее, но я использовал его в нескольких местах, поэтому я создал метод расширения.

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

Так что теперь я могу что-то сделать со всеми отмеченными строками. Компилятор довольно хорош в выводе типов, но иногда мне нужно явно объявить checkRows как тип IEnumerable.

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