1

Get the ID of selected ID in combobox and then show a form depending on the value of ID.

I have a DataGridView with a few columns in it and a combo box. I am using two data tables for this. dgv 1 is for the Data in the dgv and the other one is the item in the combo box. What I want to happen is when User chooses a status in the combo box, it will get the ID of the item, then If ID = 0 a form will show that the user needs to fill up.

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

I tried using this and put breakpoint in it but after running and clicking in the datagridview combobox the breakpoint didnt even trigger.

jkdev
  • 11,360
  • 15
  • 54
  • 77
Newbie
  • 55
  • 6
  • Are you aware that the events in the `ComboBox` control will often be raised without the `Value` of the cell being edited changing? Is that what you want? Would it not be more appropriate to handle the `CellValueChanged` event of the grid? – jmcilhinney Apr 15 '19 at 09:20
  • Yup i already fix it by using CellValueChanged. Thanks. What i am trying to do now is the response of Combobox in datagridview i need to click to a cell before the selected item in the combobox sets. – Newbie Apr 16 '19 at 00:25

1 Answers1

0

The combobox Q has been asked a few times, here for example; https://stackoverflow.com/a/21321724/7968807

But here is some code (assuming two DGV columns Id & Status). You didn't say whether the Status was a value stored in your database or whether you were just using the column as sort of indicator (if indicator, the below code would need to reset the value back to "done" after editing form etc).

Not that it matters, when you replace the datasource with your own you can sort the column behavior.

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

gjpio
  • 36
  • 4
  • I already found a solution but I will mark this as the answer since i found some useful things in your answer. Thanks – Newbie Apr 16 '19 at 00:27