Member 14132181 Ответов: 2

"Объект не может быть приведен из dbnull в другие типы".


I am getting issue while tab reach to next new row after loading data from data base to datagridview. Can anyone correct my code??


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

private void dataGridSALEITEM_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        decimal TOTALAMOUNT = 0;
        decimal TOTALCGST = 0;
        decimal TOTALSGST = 0;
        decimal NETTOTAL = 0;

        foreach (DataGridViewRow row in dataGridSALEITEM.Rows)
        {

            row.Cells[dataGridSALEITEM.Columns[7].Index].Value = (Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[3].Index].Value) * Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[4].Index].Value));

            row.Cells[dataGridSALEITEM.Columns[8].Index].Value = (Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[7].Index].Value) / 200 * Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[5].Index].Value));

            row.Cells[dataGridSALEITEM.Columns[9].Index].Value = (Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[7].Index].Value) / 200 * Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[5].Index].Value));

            row.Cells[dataGridSALEITEM.Columns[10].Index].Value = (Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[7].Index].Value) + Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[8].Index].Value) + Convert.ToInt32(row.Cells[dataGridSALEITEM.Columns[9].Index].Value));

            TOTALAMOUNT += Convert.ToDecimal(row.Cells[dataGridSALEITEM.Columns[7].Index].Value);
            TOTALCGST += Convert.ToDecimal(row.Cells[dataGridSALEITEM.Columns[8].Index].Value);
            TOTALSGST += Convert.ToDecimal(row.Cells[dataGridSALEITEM.Columns[9].Index].Value);
            NETTOTAL += Convert.ToDecimal(row.Cells[dataGridSALEITEM.Columns[10].Index].Value);
        }
        txtSUBTOTAL.Text = TOTALAMOUNT.ToString();
        txtCGST.Text = TOTALCGST.ToString();
        txtSGST.Text = TOTALSGST.ToString();
        txtGTOTAL.Text = NETTOTAL.ToString();
    }

2 Ответов

Рейтинг:
5

OriginalGriff

Это будет зависеть от данных - к которым у нас нет доступа - какая часть этого кода неверна, или ваш дизайн БД нуждается в улучшении.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Где - то в этом коде один или несколько столбцов вашей БД содержат нулевое значение, которое возвращается как DBNull, и система жалуется, что вы пытаетесь преобразовать его в другой тип, такой как целое число-а целые числа не могут содержать NULL, поэтому это абсолютно правильно.

Почему is - это NULL? Не знаю - нет доступа к вашей БД, помните - поэтому первое, что нужно сделать, это выяснить, какое это значение, а затем посмотреть на всю строку и выяснить, является ли NULL подходящим значением. Если это так, то проверьте это и сделайте то, что имеет смысл в результате. Если это не так, то выясните, как это должно быть, что оно должно содержать, и измените свою базу данных, чтобы она вообще не могла быть нулевой.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
1

RickZeeland

Вы можете попробовать это:

foreach (DataGridViewRow row in dataGridSALEITEM.Rows)
{
  if (row != null)
  {
  ... your code
  }
}

Если вы все еще получаете ошибки, вы должны проверить другие значения на null.
Кроме того, попробуйте пройти через свой код после установки точки останова, например, в строке с оператором foreach.
Вы можете проверить значения переменных, наведя на них курсор мыши.