System.NullReferenceException с datagridview

#vb.net #datagridview #visual-studio-2019

#vb.net #datagridview #visual-studio-2019

Вопрос:

Я пытаюсь заполнить два массива содержимым двух столбцов Datagridview. Я написал это:

  Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim t As Integer = (DataGridView1.Rows.Count - 1)
        For i = 0 To t
            avx(i) = DataGridView1.Rows(i).Cells("Av").Value
            hi(i) = DataGridView1.Rows(i).Cells("h").Value
            avsum = Val(avsum   avx(i))
        Next
        Label2.Text = Val(avsum)
    End Sub
  

Когда я начинаю отладку, я получаю эту ошибку в четвертой строке сообщаемого кода.

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

Кто-нибудь знает, как решить эту проблему? Как я мог инициализировать Datagridview1? Он уже был инициализирован в разделе Designer, поэтому, если я попытаюсь инициализировать его снова, я получу, очевидно, конфликт.

Комментарии:

1. Вы уже спрашивали об этой проблеме. Что было неясно в дубликате, который объясняет, что такое nullreferenceexception?

2. Я ничего не нашел о решении этой проблемы. Как я уже писал, я пытался инициализировать Datagridview1, но безуспешно

3. Элементы управления, определенные в файле конструктора, инициализируются вызовом метода InitializeComponent, и это делается в конструкторе формы. У вас есть этот вызов в конструкторе формы?

4. Нет, у меня нет упомянутой вами команды. Я попытался заполнить код перед второй строкой (‘Dim t как целое число …’), но я получаю ту же ошибку, поэтому я думаю, что это неправильный способ его использования

5. Public Sub New() InitializeComponent() End Sub но это следует делать только в том случае, если вам нужно самостоятельно создать конструктор по умолчанию, в противном случае вызов выполняется автоматически

Ответ №1:

Основываясь на моем тесте, я не могу воспроизвести вашу проблему.

Тем не менее, я создаю пример кода, который может быть похож на ваш вопрос.

Событие Form_Load

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim table As New DataTable
        table = New DataTable()
        table.Columns.Add("Av")
        table.Columns.Add("h")
        table.Rows.Add("test1", "1001")
        table.Rows.Add("test2", "1002")
        table.Rows.Add("test3", "1003")
        DataGridView1.DataSource = table
        DataGridView1.AllowUserToAddRows = False

    End Sub
  

Примечание: Свойство allowusertoaddrow уменьшит дополнительную строку.

Событие Button_Click:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim t As Integer = (DataGridView1.Rows.Count - 1)
        Dim array1(t) As String
        Dim array2(t) As String
        For i = 0 To t
            array1(i) = DataGridView1.Rows(i).Cells("Av").Value
            array2(i) = DataGridView1.Rows(i).Cells("h").Value
        Next
        For index = 0 To t
            RichTextBox1.AppendText(array1(index)   Environment.NewLine)
            RichTextBox2.AppendText(array2(index)   Environment.NewLine)
        Next
    End Sub
  

Конечный результат:

введите описание изображения здесь

Комментарии:

1. Спасибо всем за ваши ответы. avx и hi — это два массива, которые создаются при компиляции этого datagridview путем добавления строк. Таким образом, размер массивов не является фиксированным, но он зависит от количества строк, заполненных пользователем в DGV. По этой причине я думаю, что не могу установить allowusertoaddrow для false .

2. @Nicola, если размер массивов if не является фиксированным, я предлагаю вам использовать List для замены массива. Кроме того, свойство allowusertoaddrow удаляет только последнюю пустую строку, это не повлияет на другие строки.

3. J Jun еще раз спасибо за комментарий. Я не могу установить для allowusertoaddrow значение False, потому что мне нужно вручную вводить данные в мой DGV, и с этой записью я больше не могу ее заполнить. Кстати, о том, что вы мне предложили, я попытался использовать List (Of Double) из строки DGV, и, похоже, это работает. У меня возникла проблема с суммированием содержимого списка. Я написал это как: avsum = Val(avsum avx(i)) но, похоже, он выходит за пределы диапазона

4. РЕДАКТИРОВАТЬ: я заполнял список в неправильном режиме. Прежде чем я инициализировал список, а затем, с помощью цикла for, я добавил в него значения, и теперь он работает правильно. Большое спасибо за помощь!

Ответ №2:

Можете ли вы описать переменные avx() и hi() Эта ошибка возникает, возможно, количество строк datagridview больше, чем привязка к массиву