Получить идентификатор выбранного элемента в комбинированном окне Datagridview и показать форму в зависимости от выбранного значения - PullRequest
0 голосов
/ 15 апреля 2019

Получить идентификатор выбранного идентификатора в выпадающем списке, а затем показать форму в зависимости от значения идентификатора.

У меня есть DataGridView с несколькими столбцами в нем и поле со списком. Я использую две таблицы данных для этого. dgv 1 предназначен для данных в dgv, а другой - в поле со списком. Я хочу, чтобы, когда пользователь выбирает статус в поле со списком, он получает идентификатор элемента, тогда, если идентификатор = 0, форма показывает, что пользователь должен заполнить.

Private Sub dgvPassed_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)
    Dim comboCell As ComboBox = CType(e.Control, ComboBox)
    If (Not (comboCell) Is Nothing) Then
        AddHandler comboCell.SelectedIndexChanged, AddressOf Me.comboCell_SelectedIndexChanged
    End If

End Sub

Private Sub comboCell_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim cellText As String = dgvPassed.CurrentRow.Cells(7).Value.ToString
    'retrieve data from database using this cellText
End Sub

Я попытался использовать это и поместил в него точку останова, но после запуска и щелчка в комбинированном окне просмотра данных точка останова даже не сработала.

1 Ответ

0 голосов
/ 15 апреля 2019

Combobox Q был задан несколько раз, например, здесь;https://stackoverflow.com/a/21321724/7968807

Но вот некоторый код (предполагается, что два столбца DGV Id & Status).Вы не сказали, было ли Status значением, сохраненным в вашей базе данных, или вы просто использовали столбец в качестве индикатора (если индикатор, приведенный ниже код должен был бы сбросить значение обратно на «выполнено» после редактирования формы и т. Д.),

Это не имеет значения, когда вы заменяете источник данных своим собственным, вы можете отсортировать поведение столбца.

Public Class Form1


    Public Class Sample

        Public Property Id As Integer
        Public Property Status As String


        Public Sub New(id As Integer, status As String)
            Me.Id = id
            Me.Status = status
        End Sub

    End Class


    Dim Source As New List(Of Sample)({New Sample(0, "Done"), New Sample(1, "Done"), New Sample(2, "Done"), New Sample(3, "Done")})



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        DataGridView1.DataSource = Source

    End Sub


    Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged

        If DataGridView1.IsCurrentCellDirty Then
            DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
            DataGridView1.BeginEdit(True)
        End If
    End Sub


    Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

        If e.ColumnIndex < 0 OrElse e.RowIndex < 0 Then Exit Sub


        Dim ComboCell As DataGridViewComboBoxCell = DirectCast(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex), DataGridViewComboBoxCell)

        If ComboCell?.Value?.ToString = "Edit" Then

            'Get ID (Hard-coded to 0 as an example)
            Dim IdCell As DataGridViewTextBoxCell = DirectCast(DataGridView1.Rows(e.RowIndex).Cells(0), DataGridViewTextBoxCell)

            If IdCell?.Value = 0 Then

                'Open your form here 
                Using Openfd As New OpenFileDialog
                    If Openfd.ShowDialog() = DialogResult.OK Then
                        'Do stuff
                    End If
                End Using

            End If

        End If

        '// redraw 
        DataGridView1.Invalidate()

    End Sub

End Class

...