DataGridViewCell.Value.get возвращает значение null
Как мне обрабатывать ссылку на объект, не относящуюся к экземпляру объекта; DataGridViewCell.Value.get возвращает значение null? Нулевое значение - это нормально, но я не хочу исключения:
DataGridViewRow im_DataGridViewRow = vmpi_DataGridView.Rows .Cast<DataGridViewRow>() .Where(r => r.Cells[0].Value.ToString().Equals("HELP")) .First();
4 ответа
Вы можете просто использовать нуль-условные
?.
и слияние нуля
??
, чтобы избавиться от нулевых исключений из предиката, например:
r.Cells[0]?.Value?.ToString().Equals("HELP") ?? false
FirstOrDefault
Если вам не нужно исключение, если ни один элемент не соответствует критериям, вы можете использовать
FirstOrDefault
.
Кроме того, как упомянул izzy, вы можете упростить код, опустив
Where
и вместо этого передавая предикат в First или FirstOrDefault:
.Cast<DataGridViewRow>()
.FirstOrDefault(r => r.Cells[0]?.Value?.ToString().Equals("HELP") ?? false)
FirstOrDefault
вернет
default
если ничего не найдено, так
null
за
class
типы и значение по умолчанию для
struct
типы
Во-первых,
илиесли вы действительно хотите создать исключение, если элемент не найден, вы можете продолжать использовать
First
:
.Cast<DataGridViewRow>()
.First(r => r.Cells[0]?.Value?.ToString().Equals("HELP") ?? false)
Эта работа, спасибо! Вы получаете
im_DataGridViewRow == null
и без исключения:DataGridViewRow im_DataGridViewRow = vmpi_DataGridView.Rows .Cast<DataGridViewRow>() .FirstOrDefault(r => (bool)(r.Cells[vmp_COLUMN_Index_Int32]?.Value?.ToString().Equals(vmp_COLUMN_Value_string) ?? false));
Попробуйте FirstOrDefault() может вернуть значение по умолчанию, отличное от нуля
DataGridViewRow im_DataGridViewRow = vmpi_DataGridView.Rows .Cast() .Where(r => r.Cells[0].Value.ToString().Equals("HELP")) .FirstOrDefault();
for (Int32 vm_ROW_Counter_Int32 = 0; vm_ROW_Counter_Int32 < vmpi_DataGridView.Rows.Count - 1; vm_ROW_Counter_Int32++)
{
for (Int32 vm_COLUMN_Counter_In32 = 0; vm_COLUMN_Counter_In32 < vmpi_DataGridView.Rows[vm_ROW_Counter_Int32].Cells.Count; vm_COLUMN_Counter_In32++)
{
if (vm_COLUMN_Counter_In32 == vmp_COLUMN_Index_Int32)
{
vm_COLUMN_Value_string = vmpi_DataGridView.Rows[vm_ROW_Counter_Int32].Cells[vm_COLUMN_Counter_In32].Value.ToString();
if (vm_COLUMN_Value_string.Contains(vmp_COLUMN_Value_string))
{
vmpi_DataGridView.Rows[vm_ROW_Counter_Int32].Selected = true;
vmo_FOUND_boolReturn = true;
}
}
}
}