#vb.net
#vb.net
Вопрос:
Получил DGV, заполненный базой данных. Я хочу найти значение ячейки в первой строке, когда отображается форма DGV, а также значение ячейки выбранных строк, когда пользователь выбирает другую строку.
Я использовал событие RowEnter, но, похоже, оно вызывается при открытии формы и выдает ошибку. Если я попытаюсь собрать данные из ячеек, когда RowIndex> 0, это сработает, но я не могу получить значение из верхней строки.
Private Sub dgvOrders_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgvOrders.RowEnter
If e.RowIndex >= 0 Then
txtOrderNumber.Text = dgvOrders.Rows(e.RowIndex).Cells(1).Value.ToString
End If
end sub
Я вижу в документе, что событие вызывается при начальной загрузке DGV.
Использую ли я правильное событие для этого? Что-то не так в моем коде? Каков наилучший способ сделать то, что я пытаюсь сделать?!
Правильно, спасибо всем, кто помог. Это то, что я сделал. Мне не нужно было устанавливать режим выбора DGV на что-либо, кроме значения по умолчанию. Мне действительно нужно было знать, когда пользователь изменил строку, на которую он смотрел, поэтому мне нужно было поместить код в событие «SelectionChanged» DGV.
В конце концов я сдался и дополнил это, проверив, не является ли значение, возвращаемое dgvOrders.currentrow.cells(1).value, ничем, прежде чем вызывать sub, который заполняет поля текстового поля формы значениями, полученными из текущей строки.
Private Sub dgvOrders_SelectionChanged(sender As Object, e As EventArgs) Handles dgvOrders.SelectionChanged
Try
If Not dgvOrders.CurrentRow.Cells(1).Value Is Nothing Then
populateFields()
End If
Catch ex As Exception
'catch code here
End Try
End sub
Я не уверен, должен ли я отмечать какие-либо ответы в качестве ответа, но all помогли мне добраться до этого момента. Если есть способ получше, пожалуйста, дайте мне знать.
Комментарии:
1. «Правильно ли я использую событие для этого?» Это зависит от того, когда вы хотите это сделать.
RowEnter
Событие возникает каждый раз, когда курсор вводит другую строку. Это когда вы хотите сделать то, что вы хотите сделать? Если нет, то вы используете неправильное событие. Если вы хотите сделать это, когда пользователь нажимает aButton
тогда вам нужно обработатьClick
событие этогоButton
. И т.д. Вам нужно решить, при каких конкретных обстоятельствах вы хотите действовать, а затем выбрать событие, вызываемое при этих обстоятельствах.2. Ганс — Я получаю исключение System.NullReferenceException: ‘Ссылка на объект не установлена на экземпляр объекта.’ System. Windows. Формы. DataGridViewCell.Значение. ничего не возвращено. вероятно, это связано с тем, что он вызывается до того, как в DGV появятся какие-либо значения
3. jmcilhinney — я хочу извлекать значения из ячеек в любой выбранной строке. Когда появится форма, я хочу иметь возможность собирать значения ячеек из верхней строки. Таким образом, пользователь нажимает на строку, а не на кнопку. Я надеюсь, что это имеет смысл. 🙂
4. @jmcilhinney Мне удалось перехватить ошибку, только найдя currentrow.cells(1).значение, когда это верно «, если не dgvOrders.currentRow. Ячейки (1). Тогда значение равно нулю». Это останавливает ошибку и выдает значение, когда пользователь выбирает строку, но изначально не выбирает значение в первой строке. Я думаю, я мог бы программно вызвать событие изменения выбора, когда форма загружена и dgv заполнен. Кажется действительно запутанным.
5. @Hans Я получаю исключение System.NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’ System. Windows. Формы. DataGridViewCell.Значение. ничего не возвращено. вероятно, это связано с тем, что он вызывается до того, как в DGV появятся какие-либо значения
Ответ №1:
Если вы хотите щелкнуть по заголовку строки, попробуйте
Private Sub DataGridView1_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.RowHeaderMouseClick
MessageBox.Show(DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString)
End Sub
Комментарии:
1. Хотя этот код может работать, рекомендуется включить в ваш ответ больше контекста, например, почему этот код работает или почему возникла проблема, чтобы OP и другие пользователи могли понять причины, не задавая дополнительных вопросов. Пожалуйста, добавьте больше к своему ответу.
2. Извините, мне не нужен заголовок строки. Я хочу получить значения ячеек текущей выбранной строки. Спасибо.
Ответ №2:
Вы также могли бы попробовать это:
Private Sub dgvOrders_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgvOrders.RowEnter
If e.RowIndex >= 0 Then
txtOrderNumber.Text = dgvOrders.SelectedRows(0).Cells(1).Value
End If
End sub
И убедитесь, что dgvOrders.SelectionMode = Полный выбор
Комментарии:
1. Спасибо. Это извлекло бы значение, но оно не обновилось бы, если бы пользователь изменил строку, только когда я запустил эту строку кода, если я правильно понимаю?
2. Да, это позволило бы получить значение [текущая строка — ячейка 1] и помещать его в текстовое поле txtOrderNumber при каждом изменении строки.
3. Jortx — извините, я не понимаю. Если я помещу этот код в событие загрузки формы, как он будет обновляться, если пользователь изменит строку?
4. Я попробовал ваш код, используя событие DGV .SelectionChanged и получил эту ошибку. «Индекс был вне диапазона. Должно быть неотрицательным и меньше, чем размер коллекции. Имя параметра: индекс»
5. @user3844416 — Вы также должны проверить наличие e.RowIndex >= 0 и убедиться, что DataGridView. SelectionMode = полный выбор . Если вы это сделаете, вы не должны получать сообщение об ошибке…