Visual Basic.NET - Tres comboboxes en datagridview que cambian de valor dependiendo del anterior

   
Vista:
Imágen de perfil de Sebastián

Tres comboboxes en datagridview que cambian de valor dependiendo del anterior

Publicado por Sebastián (1 intervención) el 11/07/2015 19:44:56
Buenas!
Les consulto porque estoy trabado con el datagridview y sus comboboxes y no encontré otro thread que hablara de este problema específico, que es el que sigue:
En un formulario de facturación tengo un datagrid view con 3 comboboxes para Modelo, Color y Numero y otros campos para Cantidad, Precio unitario y Total(multiplo de los ultimos dos). Para evitar que se vendan items de los que no hay stock, quiero que cuando modifico el combo de Modelo, me traiga todos los colores que tengan stock de ese modelo y los coloque en el combo de Color, y si cambio el Color, haga lo mismo con los números, y si vuelvo a cambiar el modelo o color, limpie los combos siguientes y los vuelva a llenar con la info nueva. El tema es que se me armó un lío porque cuando uso el DatagridView.CellValueChanged para cuando cambio un índice, al insertar o limpiar los otros combos, vuelve a entrar al mismo evento una y otra vez y se arma una maraña en la cual a veces limpia los combos, a veces no, a veces limpia los valores anteriores y a veces no, y lo más loco es que .ValueMemeber no siempre resulta ser el índice que se cargó al momento de la carga del combo!

A continuación, ejemplo de como cargo un combo:

Dim objColumna As DataGridViewComboBoxColumn = dtgDetalle.Columns(0)
Dim colItems As New Collection
Dim objModelo As New clsModelo(objObjeto.Sesion)
datTabla = objModelo.BuscarTodos("")
objModelo = Nothing
For Each darRecord In datTabla.Rows
objModelo = New clsModelo(objObjeto.Sesion)
objModelo.Codigo = darRecord.item("CodModelo").ToString
Dim objElemento As New clsElementoListaFactura(darRecord.item("Modelo").ToString, objColumna.Items.Count, "P", darRecord.item("CodModelo").ToString, objModelo.Precio)
objColumna.Items.Add(objElemento)
objModelo = Nothing
Next
objColumna.ValueMember = "ItemData"
objColumna.DisplayMember = "Name"

Y a continuación, extracto del cellvaluechanged:

Private Sub dtgDetalle_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dtgDetalle.CellValueChanged

If e.RowIndex >= 0 Then
If e.ColumnIndex = 0 Then
Dim objColumna As DataGridViewComboBoxColumn = dtgDetalle.Columns(0)
Dim colItems As New Collection
dtgDetalle.Rows(e.RowIndex).Cells(4).Value = CType(objColumna.Items(dtgDetalle.Rows(e.RowIndex).Cells(0).Value), clsElementoListaFactura).Precio
If CStr(dtgDetalle.Rows(e.RowIndex).Cells(3).Value) = "" Then
dtgDetalle.Rows(e.RowIndex).Cells(3).Value = 1
End If

Dim Dattabla As DataTable
objColumna = dtgDetalle.Columns(0)
Dim objColor As New clsColor(objObjeto.Sesion)
Dattabla = objColor.BuscarTodos("CodColor IN (select distinct Stock.CodColor from Stock inner join Color on Stock.CodColor = Color.CodColor where Stock.Cantidad > 0 AND Stock.CodModelo=" & CType(objColumna.Items(dtgDetalle.Rows(e.RowIndex).Cells(0).Value), clsElementoListaFactura).Codigo & ")")
objColor = Nothing
objColumna = dtgDetalle.Columns(1)
objColumna.Items.Clear()
dtgDetalle.Rows(e.RowIndex).Cells(1).Value = Nothing
dtgDetalle.Rows(e.RowIndex).Cells(2).Value = Nothing
For Each darRecord In Dattabla.Rows
'Agrego color
objColor = New clsColor(objObjeto.Sesion)
objColor.Codigo = darRecord.item("CodColor").ToString
Dim objElemento As New clsElementoListaFactura(darRecord.item("Color").ToString, objColumna.Items.Count, "C", darRecord.item("CodColor").ToString, "1")
objColumna.Items.Add(objElemento)
objColor = Nothing
Next
objColumna.ValueMember = "ItemData"
objColumna.DisplayMember = "Name"


ElseIf e.ColumnIndex = 1 And dtgDetalle.Rows(e.RowIndex).Cells(1).Value <> Nothing Then
.... Y aca hago lo mismo pero si cambia el combo de Color.

Me estoy volviendo loco!
Hay alguna alternativa al DataGridView?
Si no, hay otra alternativa a cambiar los combos en tiempo de ejecución que no sea el cellvaluechanged? A mi no se me ocurre.
En fin, cualquier ayuda será apreciada, y si hace falta subo las clases.
Saludos y gracias
Sebastián
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder