none
VBasic.Net: Fase 1: LLenar DataGridView, Segun seleccion de combobx RRS feed

  • 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
    jueves, 21 de noviembre de 2019 16:02

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=" & lsactvidad

    Observa 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
    jueves, 28 de noviembre de 2019 18:55

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
    jueves, 21 de noviembre de 2019 17:24
  • 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
    jueves, 21 de noviembre de 2019 20:45
  • 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
    jueves, 21 de noviembre de 2019 22:23
  • 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
    jueves, 21 de noviembre de 2019 23:30
  • 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.

    viernes, 22 de noviembre de 2019 13:38
  • 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
    viernes, 22 de noviembre de 2019 14:10
  •  SelectionChengeCommitted?

    Este se dispara cuando se cambia el valor, cuando selecciono el campo de actividad en el combobox me arroja el valor del id, se cambia en el cboId.

    viernes, 22 de noviembre de 2019 15: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.

    jueves, 28 de noviembre de 2019 17:02
  • 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

    jueves, 28 de noviembre de 2019 18:39
  • 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=" & lsactvidad

    Observa 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
    jueves, 28 de noviembre de 2019 18:55
  • Sobre el diagrama se refiere Actividad (Campo Id) con Partidas(Campo Actividad) esa es la relacion. 

    Id es int.

    Algo asi había quitado al .tostring ya que es int pero olvide cambiar donde el Where.

    Gracias ahora ya esta. 

    Ahora la fase 2.

    jueves, 28 de noviembre de 2019 19:40