Вопрос:
Я хотел бы написать все значения из столбца 2 в список:
List<string> list = new List<string>(); foreach (var item in dataGridView1.Rows) { list.Add(item.Cells[1].Value.ToString); }
Однако это возвращает ошибку.
Лучший ответ:
Для ошибки:
“obejct” не содержит определения для “ячеек” и никакого метода расширения “Ячейки”, принимающие первый аргумент типа “объект”, могут быть найдены (вам не хватает директивы using или ссылки на сборку?).
Вам нужно изменить свой цикл foreach а вместо var указать DataGridViewRow
foreach (DataGridViewRow item in dataGridView1.Rows) { list.Add(item.Cells[1].Value.ToString()); }
Также вам нужно () для ToString
Если вы хотите использовать LINQ, вы можете сделать это в одном заявлении, например:
List<string> list = dataGridView1.Rows .OfType<DataGridViewRow>() .Select(r => r.Cells[1].Value.ToString()) .ToList();
РЕДАКТИРОВАТЬ:
Вышеизложенное может привести к исключению Null Reference, если значение Cell[1] для любой строки равно null вы можете добавить проверку перед добавлением, которая будет проверять наличие ячейки и имеет ли она значение или нет. как:
List<string> list = new List<string>(); foreach (DataGridViewRow item in dataGridView1.Rows) { if (item.Cells.Count >= 2 && //atleast two columns item.Cells[1].Value != null) //value is not null { list.Add(item.Cells[1].Value.ToString()); } }
Вышеупомянутая проверка спасет вас от вызова ToString на нулевом объекте, и вы не получите исключение.
Ответ №1
Для учета исключений Null с использованием LINQ:
List<string> list = dataGridView1.Rows .OfType<DataGridViewRow>() .Where(x => x.Cells[1].Value != null) .Select(x => x.Cells[1].Value.ToString()) .ToList(); Ответ №2
Ошибка, которую вы получаете, происходит потому, что Rows не автоматически добавляются в DataGridViewRow при использовании var. Правильный код:
List<string> list = new List<string>(); foreach (DataGridViewRow row in dataGridView1.Rows) { list.Add(row .Cells[1].Value.ToString()); }