Mostrar datos de un grid (DataGridView) de una columna combo box (DataGridViewComboBoxCell) basados en la selección de otra columna combo box

Problema: Tengo un grid, el cual tiene dos columnas de tipo combo box, en donde, dependiendo de lo que el usuario seleccione en la primera columna combo box, debe presentarse los datos en la segunda columna combo box.
Solución: Crear una nueva celda tipo combo box y reemplazarlo por el original.

Sabemos que antes de llenar el grid con los datos, debemos primero llenar los datos de la columna combo box, y luego, pasar los datos al grid, caso contrario nos dará un bonito error de que el combo box no está relacionado con nuestros datos.

Pero cuando tenemos datos de tipo grupo - subgrupo, en donde dependiendo del grupo cambia la información del subgrupo, se debe crear un mecanismo para que, a la hora de editar la información, la segunda columna combo box, cambie con respecto a la selección de la primera.

Existen muchas maneras de hacerlo, sobre todo dependiendo de cómo se esté obteniendo la información y cómo se estén enlazando los datos al combo box.

Se puede encontrar mucha información en la red sobre la manera de realizar este mismo proceso, algunos indican que la manera más práctica es traer toda la información en la segunda columna combo box y filtarlo dependiendo de lo seleccionado.

En mi caso, que la información es demasiado extensa para traerla toda y ponerla dentro de la segunda columna del combo box, he decidido volver a traer la información desde la base de datos con lo seleccionado en el primer combo box y llenar el segundo combo box con la resultante. Esto también sirve de ayuda para que, dependiendo de los datos de una tercera y/o cuarta columna, también se deba realizar el filtro correspondiente.

Para que se entienda mejor mi explicación, voy a poner un poco de código de ejemplo.

Tengo un formulario llamado Form1, el cual contiene un grid llamado DataGridView1, el cual a su vez, tiene dos columnas combo box llamadas dtg_cmb1 y dtg_cmb2

La acción que se dispara al momento en que el usuario selecciona un dato del primer combo box es el CellValueChanged, por lo que iniciaré por allí.

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellValueChanged
 Dim r As Integer = e.RowIndex
 Dim c As Integer = e.ColumnIndex
 Dim dgrow As New DataGridViewComboBoxCell()
 
 Select Case c
         Case 1 'Pregunto si la columna seleccionada pertenece al primer combo box
          'Aquí realizo el llenado de los datos, dependiendo de lo seleccionado
          Using connection As SqlConnection = New SqlConnection(conn)
           Dim command As New SqlCommand("sp_datos_combobox", connection)
           command.CommandType = CommandType.StoredProcedure
           Dim adapter As New SqlDataAdapter(command)
           With command.Parameters
            .Add(New SqlParameter("@param1", SqlDbType.Int)).Value = DataGridView1.Rows(r).Cells("dtg_cmb1").Value
           End With
           Dim dataCombo As New DataTable
           adapter.Fill(dataCombo)
           'Aqui enlazo los datos al combo box
           dgrow.DataSource = dataCombo
           dgrow.DisplayMember = "campo1"
           dgrow.ValueMember = "campo2"
           
           'Aqui cambio el combo box original, por lo obtenido de la consulta
           DataGridView1.Item("dtg_cmb2", DataGridView1.CurrentCell.RowIndex) = dgrow
          End Using
 End Select
End Sub