DataGridView — поиск текущей строки

#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.

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.rowenter?redirectedfrom=MSDNamp;view=netframework-4.7.2

Использую ли я правильное событие для этого? Что-то не так в моем коде? Каков наилучший способ сделать то, что я пытаюсь сделать?!

Правильно, спасибо всем, кто помог. Это то, что я сделал. Мне не нужно было устанавливать режим выбора 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 Событие возникает каждый раз, когда курсор вводит другую строку. Это когда вы хотите сделать то, что вы хотите сделать? Если нет, то вы используете неправильное событие. Если вы хотите сделать это, когда пользователь нажимает a Button тогда вам нужно обработать 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 = полный выбор . Если вы это сделаете, вы не должны получать сообщение об ошибке…