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

            }
Другие вопросы по тегам