#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 больше, чем привязка к массиву