Principales respuestas
VBasic.Net: Fase 1: LLenar DataGridView, Segun seleccion de combobx

Pregunta
-
Buenos Dias,
Tengo algo, pero me da error.
Me explico: Tengo 2 tablas Actividad y Partida, 1 actividad tiene varias partidas, cuando elijo la actividad desde el combo según su prefijo entonces en el datagridview debe mostrarme sus partidas, la relación es el código de actividad.
Por cada elección del combo me mostrara las partidas que correspondan
Pero tengo un problema que en otros datagridv se me repite el contenido y no me deja mostrar si selecciono algo del otro dgv se refleja en el otro y no puedo ver si lo que hago respecto al combo valga
- Editado SUSPENDX2 jueves, 28 de noviembre de 2019 22:15
Respuestas
-
Si no me equivoco, el problema es que en el Where estás filtrando por Id, pero ese es el Id de partida, no el Id de Actividad. Me imagino que el campo correcto es el que has llamado "Actividad" en la tabla de Partidas, aunque en el diagrama de tablas que pusiste solo se ve que hay una FK pero no se sabe cuál es el campo que le corresponde.
Es decir, en lugar de esto:
Dim lspartida = Me.cboActividad.SelectedValue.ToString
Dim lsQuery As String = "Select * From Partida Where Id='" & lspartida & "'"Poner esto otro:
Dim lsactvidad = Me.cboActividad.SelectedValue
Dim lsQuery As String = "Select * From Partida Where Actividad=" & lsactvidadObserva que le he quitado las comillas, presumiendo que el Id de Avtividad es numérico. Pero si fuese un string, vuélvele a poner las comillas.
- Marcado como respuesta SUSPENDX2 jueves, 28 de noviembre de 2019 19:40
Todas las respuestas
-
Pero tengo un problema que en otros datagridv se me repite el contenido y no me deja mostrar si selecciono algo del otro dgv se refleja en el otro y no puedo ver si lo que hago respecto al combo valga
Esto indica que tienes los dos dgvs vinculados al mismo DataSource. Por ejemplo, imagínate que cargas de datos un DataTable y lo conectas al DataSource de uno de los Grids. Despues haces otra consulta distinta que carga sus resultados en el mismo DataTable, y este DataTable lo conectas a otro dgv.
Después de hacer eso esperas que cada uno de los dos grids muestre los resultados de su respectiva consulta, pero no, no funciona así. Cuando conectas un DataTable a un Grid no se copian los datos que hay en ese momento en el DataTable, sino que queda "vinculado" y entonces cada uno de los cambios que en el futuro se producen en el Grid se copian al DataTable y viceversa. Eso implica que si has conectado dos grids al mismo datatable, todo lo que cambies en uno aparece en el otro, y viceversa.
Lo del DataTable es solo un ejempo. Si usas otro origen de datos, como por ejemplo un BindingSource, ocurre lo mismo.
La solución es, lógicamente, usar dos orígenes de datos distintos, uno para cada Grid. Esto es fácil si lo haces por programación, solo hay que declarar dos variables y hacerles a cada una su "new" correspondiente. Pero si lo has hecho gráficamente desde el diseñador tienes que tener cuidado de añadir dos instancias del dataset (y del bindingsource si es que lo usas) y conectar cada instancia a un grid, no dos grids a la misma instancia.
Una buena forma de hacer esto sin hacerte un lío es añadir al proyecto dos UserControls y meter dentro de cada UserControl un Grid junto con sus correspondientes objetos de acceso a datos. Después añades los dos usercontrols sobre el formulario que anteriormente contenía directamente los dos grids. De esta forma garantizas que no se te mezclan los dos orígenes de datos.
- Propuesto como respuesta Pablo Rubio jueves, 21 de noviembre de 2019 21:35
-
Tengo un codigo:
Private Sub cboActividad_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboActividad.SelectedIndexChanged Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString()) Dim cmd As New SqlCommand("Select Id,Cod_Partida,Descripcion,Costo_Urbano,Costo_Rural,Actividad from Partida WHERE Actividad=@1 ORDER BY Descripcion", cnx) cmd.Parameters.AddWithValue("@1", cboId.Text) Dim dr1 As New SqlDataAdapter(cmd) Dim dt1 As New DataTable dr1.Fill(dt1) dgvPartidas.DataSource = dt1 dgvPartidas.Columns("Id").Visible = False dgvPartidas.Columns("Actividad").Visible = False End Using End Sub
Pero sucede que cuando elijo un valor del cboactividad el cboId no se carga, y la dgv sol ose carga los campos no se llena, luego elijo el segundo no carga el cboid, elijo el tercero carga el id 3 y se llena la dgv pero no con los datos que pertenece al 3.
A que se debe que no este tomando los valores correctamente. tengo entendido que debo usar algo con el SelectionChangeCommitted pero no recuerdo.
- Propuesto como respuesta Pablo Rubio jueves, 21 de noviembre de 2019 23:10
-
Tiene bastante buena pinta. Deberías seguirlo paso a paso con el debugger examinando las variables, a ver qué es lo que realmente te genera en el parámetro y lo que realmente te trae al datatable en cada una de las veces que lo llamas, y eso debería dar alguna pista sobre lo que está pasando.
Lo único que veo un poco anómalo es el tema de que estás tomando en el parámetro el cboId.Text. El .Text de un combo solo se carga si el usuario teclea un texto a mano, pero si elige un valor de la lista desplegable no se copia al .Text, sino que tienes que leerlo desde el .SelectedValue. Comprueba esto examinando con el debugger el valor que te llega, no vaya a ser que el problema esté ahí.
- Propuesto como respuesta Pablo Rubio jueves, 21 de noviembre de 2019 23:10
-
Asi viendo eso del selectvalue sin aun ver paso a paso bueno al cambiar ese detalle obtengo este error.
Bueno luego de todo eso habia modificado algo pero si elijo la misma actividad 2 veces el dgv se cambia por lo tanto no me esta dando el valor que deseo..
Luego si escojo otra ves el mismo de id 2 ya me sale su valor real de la tabla que son 2 registros.
Que motivo es eso?
Hice una modificacion al codigo.
Private Sub Partidas() Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString()) Dim cmd As New SqlCommand("Select Id,Cod_Partida,Descripcion,Costo_Urbano,Costo_Rural,Actividad from Partida WHERE Actividad='" & Me.cboId.SelectedValue & "'", cnx) Dim dr1 As New SqlDataAdapter(cmd) Dim dt1 As New DataTable dr1.Fill(dt1) dgvPartidas.DataSource = dt1 dgvPartidas.Columns("Id").Visible = False dgvPartidas.Columns("Actividad").Visible = False End Using End Sub Private Sub cboActividad_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboActividad.SelectedIndexChanged Partidas() End Sub End Class
- Editado SUSPENDX2 jueves, 21 de noviembre de 2019 23:36
-
He realizado otra modificacion de codigo y pasa lo mismo, en la primera seleccion no carga la grilla lo vuelvo a elegir y ya carga y asi por cada item del combo.
Public Function Partida(id As Integer) As DataTable Dim dt As New DataTable() Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString()) Dim ConsultaTCambio As String = "Select Id,Cod_Partida,Descripcion,Costo_Urbano,Costo_Rural,Actividad from Partida WHERE Actividad=@acti ORDER BY Actividad" Dim cmd As New SqlCommand(ConsultaTCambio, cnx) cmd.Parameters.AddWithValue("@acti", Convert.ToInt32(id)) Dim da As New SqlDataAdapter(cmd) da.Fill(dt) Return dt End Using End Function -- Private Sub cboActividad_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboActividad.SelectionChangeCommitted Dim dt As New DataTable() dt = Partida(Convert.ToInt32(cboId.SelectedValue)) dgvPartidas.DataSource = dt End Sub
Por favor de su ayuda en que estoy mal.
-
No hay nada "obvio" en el fragmento de código que sea suficiente como para hacerlo fallar.
En estos casos, no hay más remedio que usar el debugger. Pon un punto de ruptura y ejecuta el programa paso a paso, examinando las variables en cada punto, hasta que te encuentres qué es lo que sucede cuando no esperabas que sucediese, o cuál es la variable que no trae el valor que esperabas que trajese.
Al hacer esto muchas veces te llevas sorpresas. Por ejemplo, al dar un paso al frente en el debugger descubres que se dispara un evento que no pensabas que se estuviese disparando, y que te modifica un dato que no esperabas que se modificase en ese punto. O examinas el SelectedValue y te encuentras que no tiene el valor correcto porque está confundido con el SeletedText (pero no pienses que te está pasando precisamente esto solo porque yo lo haya mencionado como ejemplo, solo lo pongo con la intención de hacer ver que a veces encuentras cosas que no eran como pensabas, y mientras no usas el Debugger no lo descubres).
Por cierto, ¿por qué has metido el código en el evento SelectionChengeCommitted? Jamás había visto ningún programa que utilizase este evento. ¿Qué hace, bajo qué circunstancias se dispara? ¿En qué difiere del SelectedIndexChanged?
- Propuesto como respuesta Pablo Rubio lunes, 25 de noviembre de 2019 17:24
-
-
Aun no me sale y no hay errores, como modifique algunas cosas en la tabla ahora ya no se muestra nada asi que lo vuelvo a poner.
el cbo es cboactividad el que muestra CONEXIONES NUEVAS cuando yo elijo la actividad este debe llenarme la datagrid de sus partidas, esta relacionado por el códigoid de la actividad.
y por ejemplo la data es: Tabla Actividad:
Tabla Partida: 1 corresponde a la actividad conexiones nuevas esa es la relacion.
Por tanto intento es que cuando seleccione algo del combobox en el datagrid me muestre sus correspondientes partidas según la actividad seleccionada.
-
Bueno de todo esto hice lo siguiente me sale bien pero no me da todos los valores sino solo de 1 por ejemplo para conexiones nuevas hay 8 items con este código me arroja solo 1.
Private Sub Actividad() Try Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString()) Dim cmd As New SqlCommand("Select Id,Actividad FROM Actividad", cnx) Dim dr1 As New SqlDataAdapter(cmd) Dim dt1 As New DataTable dr1.Fill(dt1) With cboActividad .DataSource = dt1 .DisplayMember = "Actividad" .ValueMember = "Id" .SelectedIndex = -1 End With End Using Catch ex As Exception MessageBox.Show(ex.Message, "Carga..", MessageBoxButtons.OK, MessageBoxIcon.Information) End Try End Sub
Private Sub cboActividad_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboActividad.SelectionChangeCommitted ' limpiar los valores del DataGridView Me.dgvPartidas.DataSource = Nothing Dim lspartida = Me.cboActividad.SelectedValue.ToString Dim lsQuery As String = "Select * From Partida Where Id='" & lspartida & "'" Try ' Configuramos una conexión con el origen de datos. Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString()) Dim lDataAdapter As New SqlDataAdapter(lsQuery, cnx) ' instanciar datatable Dim lDataTable As New DataTable() lDataAdapter.Fill(lDataTable) ' cargar los valores al DataGridView Me.dgvPartidas.DataSource = lDataTable End Using Catch ex As Exception MessageBox.Show(ex.Message, "Partidas", MessageBoxButtons.OK, MessageBoxIcon.Information) End Try End Sub
Ahora toca analizar ese tema
-
Si no me equivoco, el problema es que en el Where estás filtrando por Id, pero ese es el Id de partida, no el Id de Actividad. Me imagino que el campo correcto es el que has llamado "Actividad" en la tabla de Partidas, aunque en el diagrama de tablas que pusiste solo se ve que hay una FK pero no se sabe cuál es el campo que le corresponde.
Es decir, en lugar de esto:
Dim lspartida = Me.cboActividad.SelectedValue.ToString
Dim lsQuery As String = "Select * From Partida Where Id='" & lspartida & "'"Poner esto otro:
Dim lsactvidad = Me.cboActividad.SelectedValue
Dim lsQuery As String = "Select * From Partida Where Actividad=" & lsactvidadObserva que le he quitado las comillas, presumiendo que el Id de Avtividad es numérico. Pero si fuese un string, vuélvele a poner las comillas.
- Marcado como respuesta SUSPENDX2 jueves, 28 de noviembre de 2019 19:40
-