Нахождение искомый строки более 1 раза

255
14 марта 2017, 11:48

1) Пытаюсь сделать поиск в DataGridView с помощью операций LINQ:

var find = UsersDataGridView.Rows.Cast<DataGridViewRow>()
.FirstOrDefault(x => x.Cells[cbFilterSearch.SelectedIndex].Value.ToString().Contains(tbSearch.Text));
if (find != null)
{
    find.DefaultCellStyle.BackColor = Color.Red;
}

Раскрашивает только одну строку в красный цвет, хотя нахождений больше. Как исправить?

2) Возможно ли переделать данный код на LINQ?

for (int i = 0; i < UsersDataGridView.RowCount; i++)
    UsersDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White;
Answer 1

Раскрашивает только одну строку в красный цвет по причине того, что Вы берете FirstOrDefault - это означает, что в результате получим либо одну строку, либо null если элемент не найден (значение по умолчанию Default).

Поэтому немного модифицируем Ваш код следующим образом:

var indexFilter = cbFilterSearch.SelectedIndex; // вынес для удобства
var findResult = UsersDataGridView.Rows.Cast<DataGridViewRow>()
    .Where(x => x.Cells[indexFilter].Value.ToString().Contains(tbSearch.Text)).ToList();
// меняем цвет так (по Вашему примеру)
for (int index = 0; index < findResult.Count; index++)
{
    findResult[index].DefaultCellStyle.BackColor = Color.Red;
}
// или меняем цвет вот так (немного удобнее)
foreach (DataGridViewRow row in findResult)
{
   row.DefaultCellStyle.BackColor = Color.Red;
}

Попросту заменили FirstOrDefault на Where(predicate).ToList() и вместо одного элемента - получили коллекцию элементов, удовлетворяющих условию поиска.

По поводу второго вопроса, можно предложить такой вариант LINQ:

UsersDataGridView.Rows
    .Cast<DataGridViewRow>()
    .ToList()
    .ForEach(x => x.DefaultCellStyle.BackColor = Color.White); 

Преобразуем элемент Rows из типа DataGridViewRowCollection в список элементов DataGridViewRow и в цикле ForEach меняем значение BackColor у каждого элемента коллекции.

Answer 2
  1. FirstOrDefault — возвращает первый элемент коллекции или значение по-умолчанию, если коллекция пуста. Для вашей задачи подходящим будет метод Where который фильтрует коллекцию по предикату.

  2. Можно задать цвет всем ячейкам сразу

READ ALSO
oracle: Именованные параметры или их порядок?

oracle: Именованные параметры или их порядок?

даже не знаю с чего начать

337
entity framework 6 и sSQLite

entity framework 6 и sSQLite

Получаю ошибки: SQLite error (1): no such table: __MigrationHistory SQLite error (1): no such table: __MigrationHistory SQLite error (1): no such table: EdmMetadata

334
Где достать Roslyn?

Где достать Roslyn?

Доброго времени сутокГде достать библиотеки для использования Roslyn? Смотрел примеры на этом сайте: https://blogs

229