Cody O'Meara Ответов: 2

Когда значение равно нулю, получая ошибку даже при проверке данных?


У меня есть следующая часть кода:

If IsNothing(strCellValue = tabledgv.Rows(newNum).Cells(1).Value.ToString()) Then

            datetxt.Text = "N/A"
        Else
            datetxt.Text = strCellValue

        End If


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

System.NullReferenceException: 'Object reference not set to an instance of an object.'

System.Windows.Forms.DataGridViewCell.Value.get returned Nothing.


Что я уже пробовал:

Я пробовал удалить все это. Я также попытался использовать isDBNull, так как это нулевое значение в SQL, но исправил это с помощью .tostring в конце.

0x01AA

tabledgv.Rows(newNum).Cells(1): Похоже, что строка/Col не существует.

Cody O'Meara

Спасибо за ответ. Правильный. Внутри ячейки нет никакой ценности, поэтому я пытаюсь заставить ее сказать "N/A", когда в ячейке ничего нет.

0x01AA

Я думаю, вы неправильно меня поняли. Я думаю, что проблема заключается не только в этом tabledgv.Rows(newNum) или тогда клетка не существует. Это вы не можете проверить, получив доступ tabledgv.Rows(newNum).Cells(1).Value. Перед этим вам нужно убедиться, что запрошенная строка, а также запрошенный col действительно существуют.

Cody O'Meara

Наверное, я что-то упускаю. У меня есть это "totalRows = tabledgv.Rows.GetRowCount(DataGridViewElementStates.Visible) - 1" для получения общего количества строк. Он действительно работает, так как у меня есть метка, которая отображается на нагрузке, к которой относится правильное количество. У меня также есть эта проверка"If newNum > totalRows Then newNum = 1 End If", чтобы сбросить обратно в первую строку, в которой есть 2 строки с данными. Это происходит при попытке второго ряда. Это происходит перед проверкой, чтобы увидеть, равно ли strCellValue nothing.

0x01AA

почему? -1 в totalRows = tabledgv.Rows.GetRowCount(DataGridViewElementStates.Visible) - 1?

2 Ответов

Рейтинг:
12

RickZeeland

В этом блоге рекомендуется не использовать IsNothing(): Блог Патрика Стила .NET - избегание IsNothing()[^]
Вместо этого вы можете использовать:

If tabledgv.Rows(newNum).Cells(1).Value Is Nothing Then
...


Cody O'Meara

Спасибо Вам за ответ, Рикзиленд. Я его меняю. Теперь получаем состояние подавления
Ошибка BC30020 'Is' оператор не принимает операнды типа 'Boolean'. Операнды должны быть ссылочными или обнуляемыми типами.

RickZeeland

Может быть, это флажок? тогда использовать:
If (tabledgv.Rows(newNum).Ячейки(1).Значение) Затем
...

Рейтинг:
0

Maciej Los

Вы делаете это неправильно!

Во-первых, вы не можете инициировать переменную внутри IsNothing функция, поскольку подчеркнутая часть строки интерпретируется компилятором как логическое значение (результат сравнения):

If IsNothing(strCellValue = tabledgv.Rows(newNum).Cells(1).Value.ToString()) Then

Логическое значение никогда не вернет null/nothing!

comparison of strCellValue to the tabledgv cell Value
"" = "" ' returns true
"" = "some value" ' returns false


Если ваш объект DataGrdView привязан к datatable базы данных SQL, я бы изменил его на:
If DbNull.Value.Equals(tabledgv.Rows(newNum).Cells(1).Value) Then


Для получения более подробной информации, пожалуйста, смотрите:
Операторы Сравнения - Visual Basic | Microsoft Docs[^]
Информация.Метод IsNothing(Object) (Microsoft.VisualBasic) | Microsoft Docs[^]
Значение dbnull.Поле Значения (Система) | Microsoft Docs[^]