none
Abrir fomulario al hacer doble clic en celda de DatagRidView?? RRS feed

  • Pregunta

  • Buen día compañeros,

    Estoy trabajando en una aplicación, en donde tengo un DataGridView que carga registros desde una tabla de SQL Server. Ahora, por predeterminado, la aplicación carga 5 registros al DGV que yo he creado, con cada uno de esos registros abro un formulario, form1, form2, forms3, etc. Si hago doble clic en la celda de la clave1, se abre el form1 con sus registros, clave2 abre el form2 igual con sus registros con este código:

    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "1" Then
                    form1.show
    
    ElseIf DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "2" Then
                    form2.show
    End If

    Ahora, estoy creando un formPersonalizado en donde el usuario puede crear sus propios formatos para después imprimirlos en un reporte, por decir si el usuario crea un registro con clave 6 con sus respectivos datos, como abro este formPersonalizado con los registros de esa misma clave que el usuario ha creado previamente al doble clic en la clave?

    Tengo que crear un query y obtener la clave del registro y uso el mismo código que puse arriba?? Ya he tratado de algunas formas y no logro hacerlo, la verdad ya me enredé

    Espero haberme explicado

    Gracias, saludos




    jueves, 2 de noviembre de 2017 2:20

Respuestas

  • Perdona Juan, he dado vueltas al asunto y no puedo entenderte, que soy duro de entendederas, podrías adjintar alúna imagen como para aclarar un poco el tema?

    _Ahora trato de simplificar la consulta según entiendo, si es que necesitas pasar datos del Form1 (padre) al forPersonalizado, en ese caso puedes generar un textbox y en la propiedad text agregas la clave ej Dim text as new textbox

    text.Text = Me.Datagridview1.Rows.Item(0).Cells(4).Value

    froPersoanlizado.Controls.Add(text)

    _Si el caso es que no quieres que abra mas de un mismo formulario ej, le colocas en la propiedad Name del frmPersonalizado "frmPersonalizado "

    y En el evento del DGV que abre el formulario,  previamente colocas el siguiente código

     For Each forma As Form In Application.OpenForms
                If forma.Name = "frmPersonalizado" Then
                    MsgBox("El formulario ya está abierto")
                    Exit Sub
                End If
            Next

    _Si el caso es que el usuario genera una clave y no sabes como insertarla en el DGV emtonces en algún evento donde valides la clave colocas ej¨:

     Dgv.Columns.Add(TextBox1.Text, TextBox1.Text)
            Dim i As Integer = Dgv.Columns.Count - 1
            Dgv.Rows(0).Cells(i).Value = TextBox1.Text

    Suponiendo que el texbox1 contiene la nueva clave, y en el codigo de busqueda

    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = TextBox1.Text Then
     For Each forma As Form In Application.OpenForms
                If forma.Name = "frmPersonalizado" Then
                    MsgBox("El formulario ya está abierto")
                    Exit Sub
                End If
            Next
    
         formPersonalizado.show
    
    End sub

    O una variable String en lugar de textbox

    Disculpas de ante mano si no es lo que necesitas

    Saludos

    viernes, 3 de noviembre de 2017 7:37
  • Bueno creo.. que ahora  voy comprendiendo, Lo que yo haría sería, en primer caso comprobar que la clave existe , para esto usaría excecuteScalar si el valor en int me dievuelve 0 no existe si es 1 si para luego disparar el código y guardar el registro que contenga esa clave en el FormPersonalizado ej: en el evendo dobleclick del DGV

     Dim i As Integer = Dgv.CurrentCell.ColumnIndex
            If i = 0 Then
                Dim Str As String = Convert.ToString(Dgv.Rows(Dgv.CurrentRow.Index).Cells(i).Value)
                cm = New SqlCommand("SELECT COUNT (*) from Tabla WHERE Clave_form =@Clave", Conexion)
                conexion.Open()
                cm.Parameters.AddWithValue("@Clave", Str)
                Dim Si As Integer = Convert.ToInt32(cm.ExecuteScalar())      
               conexion.Close()
                If Si = 1 Then
                   Conexion.Open()
                    Dim adapter = New SqlDataAdapter("SELECT * from Tabla WHERE Clave_form =" & "'" & Str & "'", Conexion)
                    Dim tabla As New DataTable
                    adapter.Fill(tabla)
                    Form2.TextBox1.Text = tabla.Rows(0).Item("campo1")
                    Form2.TextBox2.Text = tabla.Rows(0).Item("Campo2")
                    Form2.TextBox3.Text = tabla.Rows(0).Item("Campo3")
                    Form2.TextBox4.Text = tabla.Rows(0).Item("Campo4")
                    Form2.TextBox5.Text = tabla.Rows(0).Item("Campo5")
                    Form2.TextBox6.Text = tabla.Rows(0).Item("Campo6")
                    Form2.Show() Else MsgBox("Examen no encontrado") End If Conexion.Close() End If

    Obviamente los TextBox serían del frmPresonalizado (frmPersonalizado.TextBox1.Text = tabla.Rows.........) En este ejemplo utilizé ADO.NET pero al caso no varía con Sql pero no lo copies tal cual, espero te sirva

    Saludos


    • Editado Marcelo PF miércoles, 8 de noviembre de 2017 3:05
    • Marcado como respuesta Juan Ortiz T jueves, 9 de noviembre de 2017 18:58
    miércoles, 8 de noviembre de 2017 3:02

Todas las respuestas

  • Hola Juan, habría que ver que se debe cargar en ese formularo, supongo que el usuario pretenderá generar un select dependiendo de su necesidad, para esto hay facilitarle campos para que rellene, en fin necesitaríamos más datos y algo más de código. En cuanto a la carga del frm no sería complicado en principio (DIm Frm As New Form) luego agregarle los controles necesario Dim DGV As New DataGridView ... cuando tengamos todos los controles  se lo agregamos al Frm Frm.Controls.Add(DGV) por ultimo agregarlo al Form1 Form1.Conntrols.add(Frm) y ejecutarlo Frm.Show,  claro todo esto dentro de el disparo de la celda como dices tú, para el caso puedes, también, generar una función que haga todo esto y ejecutar desde la celda ej ...CrearForm()

    Saludos

    jueves, 2 de noviembre de 2017 3:20
  • Hola Marcelo,

    antes que nada, muchas gracias por tu respuesta.

    Esos 5 registros que tengo (las 5 claves y sus respectivos datos) no tengo problemas para cargarlos ya que como comenté, esos los tengo como predeterminados en mi aplicación. Por ejemplo en sql tengo:

    clave: 1, area: ingenieria, ubicación: edificio 2

    clave:2, area: informática, ubicación: edificio 5

    Esto es un ejemplo para hacerlo más rápido, cada uno de los 5 forms tienen diferentes valores

    Y así para cada una de las 5 areas, al hacer doble clic en la clave1: cargo los datos (area ing y edificio 2) en el form1 en sus respectivos textbox usando un reader que recorre cada uno de los registros por clave en la tabla SQL.

    EN el formPersonalizado, puedo grabar datos que el usuario desee y cargarlos en este mismo form abriendolo manualmente, pero el problema que tengo es eso del doble clic, como leer esa clave al doble clic en la celda del DGV cargar sus registros

    Gracias, saludos

    jueves, 2 de noviembre de 2017 3:40
  • A ver si es así, Dgv es del Form1

     Private Sub Button23_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button23.Click
            Dim Frm As New Form
            Dim DGV As New DataGridView
            DGV.Columns.Add("Column1", "Column1")
            DGV.Columns.Add("Column2", "Column2")
            DGV.Columns.Add("Column3", "Column3")
            DGV.Columns.Add("Column4", "Column4")
            DGV.Height = 400
            DGV.Width = 600
            Frm.Height = 700
            Frm.Width = 500
            AddHandler DGV.CellDoubleClick, AddressOf Dgv_CellDoubleClick
            Frm.Controls.Add(DGV)
            Frm.Show()
    
    
        End Sub

    Tengo Msgbox("HolaMundo") en los eventos celldoubleclick del Form1


    jueves, 2 de noviembre de 2017 4:14
  • Disculpa la demora en contestar Marcelo,

    Usando un reader, cargo los registros correspondientes para cada form en el doble clic de la celda clave del DGV. Si reader tiene filas entonces:

    clave.Text = reader.Item("clave").ToString
    area.Text = reader.Item("area").ToString
    departam.Text = reader.Item("dpto").ToString

    Usando:

    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "1" Then
                    form1.show
    End If

    Ahora, lo que no logro, si el usuario creó un formato con clave X, quedaría algo así
    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "X" Then
                    formPersonalizado.show
    End If

    Es en lo que tengo duda, ese form puede abrir cualquier cantidad de formatos que el usuario creó, buscando por esa clave X, en donde la clave es única

    jueves, 2 de noviembre de 2017 20:20
  • Perdona Juan, he dado vueltas al asunto y no puedo entenderte, que soy duro de entendederas, podrías adjintar alúna imagen como para aclarar un poco el tema?

    _Ahora trato de simplificar la consulta según entiendo, si es que necesitas pasar datos del Form1 (padre) al forPersonalizado, en ese caso puedes generar un textbox y en la propiedad text agregas la clave ej Dim text as new textbox

    text.Text = Me.Datagridview1.Rows.Item(0).Cells(4).Value

    froPersoanlizado.Controls.Add(text)

    _Si el caso es que no quieres que abra mas de un mismo formulario ej, le colocas en la propiedad Name del frmPersonalizado "frmPersonalizado "

    y En el evento del DGV que abre el formulario,  previamente colocas el siguiente código

     For Each forma As Form In Application.OpenForms
                If forma.Name = "frmPersonalizado" Then
                    MsgBox("El formulario ya está abierto")
                    Exit Sub
                End If
            Next

    _Si el caso es que el usuario genera una clave y no sabes como insertarla en el DGV emtonces en algún evento donde valides la clave colocas ej¨:

     Dgv.Columns.Add(TextBox1.Text, TextBox1.Text)
            Dim i As Integer = Dgv.Columns.Count - 1
            Dgv.Rows(0).Cells(i).Value = TextBox1.Text

    Suponiendo que el texbox1 contiene la nueva clave, y en el codigo de busqueda

    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = TextBox1.Text Then
     For Each forma As Form In Application.OpenForms
                If forma.Name = "frmPersonalizado" Then
                    MsgBox("El formulario ya está abierto")
                    Exit Sub
                End If
            Next
    
         formPersonalizado.show
    
    End sub

    O una variable String en lugar de textbox

    Disculpas de ante mano si no es lo que necesitas

    Saludos

    viernes, 3 de noviembre de 2017 7:37
  • Que tal Marcelo,

    creo que yo no me he explicado de la mejor manera posible. Tienes razón, es más fácil con imágenes.

    Es un software para un laboratorio de análisis clínicos en donde intento que el usuario pueda crear sus formatos de examenes.

    Este es el form en donde el usuario puede crear sus formatos, y cuantas sean necesarios. (este es el formPersonalizado)

    Estos datos se guardan en una tabla 'examenes' en SQL Server, en donde la clave es única

    Ahora, cuando llega una solicitud de estudios, en un DGV2 cargo todos los examenes de la BD y los paso al DGV1 según los estudios requeridos. Por ejemplo en este caso si se solicitó el examen1 y el examen2 (este es el DGV1)

    AHora, en el doble clic en examen1, abrir formato de examen1 de arriba como el usuario guardo su formato. O si doble clic en examen2, que abra el formato para el examen2.

    Gracias, saludos!


    sábado, 4 de noviembre de 2017 0:16
  • Alguna sugerencia?

    He dado vueltas y no logro hacerlo. Entiendo mas o menos que tengo que crear un query y obtener esa clave en una variable para después compararla en el evento doble clic de la celda del DGV. O estoy equivocado?

                Using conn As New SqlConnection('AQUI MI CADENA DE CONEX')
                    conn.Open()
                    Dim cmd As New SqlCommand("", conn)
                    cmd.CommandText = "SELECT * " _
                        & "FROM tabla WHERE claveExam= @claveExam"
                   
    End Using

    Aquí es donde tengo el problema, como comparar esa clave con la del DGV?

    SAludos,

    martes, 7 de noviembre de 2017 18:29
  • Bueno creo.. que ahora  voy comprendiendo, Lo que yo haría sería, en primer caso comprobar que la clave existe , para esto usaría excecuteScalar si el valor en int me dievuelve 0 no existe si es 1 si para luego disparar el código y guardar el registro que contenga esa clave en el FormPersonalizado ej: en el evendo dobleclick del DGV

     Dim i As Integer = Dgv.CurrentCell.ColumnIndex
            If i = 0 Then
                Dim Str As String = Convert.ToString(Dgv.Rows(Dgv.CurrentRow.Index).Cells(i).Value)
                cm = New SqlCommand("SELECT COUNT (*) from Tabla WHERE Clave_form =@Clave", Conexion)
                conexion.Open()
                cm.Parameters.AddWithValue("@Clave", Str)
                Dim Si As Integer = Convert.ToInt32(cm.ExecuteScalar())      
               conexion.Close()
                If Si = 1 Then
                   Conexion.Open()
                    Dim adapter = New SqlDataAdapter("SELECT * from Tabla WHERE Clave_form =" & "'" & Str & "'", Conexion)
                    Dim tabla As New DataTable
                    adapter.Fill(tabla)
                    Form2.TextBox1.Text = tabla.Rows(0).Item("campo1")
                    Form2.TextBox2.Text = tabla.Rows(0).Item("Campo2")
                    Form2.TextBox3.Text = tabla.Rows(0).Item("Campo3")
                    Form2.TextBox4.Text = tabla.Rows(0).Item("Campo4")
                    Form2.TextBox5.Text = tabla.Rows(0).Item("Campo5")
                    Form2.TextBox6.Text = tabla.Rows(0).Item("Campo6")
                    Form2.Show() Else MsgBox("Examen no encontrado") End If Conexion.Close() End If

    Obviamente los TextBox serían del frmPresonalizado (frmPersonalizado.TextBox1.Text = tabla.Rows.........) En este ejemplo utilizé ADO.NET pero al caso no varía con Sql pero no lo copies tal cual, espero te sirva

    Saludos


    • Editado Marcelo PF miércoles, 8 de noviembre de 2017 3:05
    • Marcado como respuesta Juan Ortiz T jueves, 9 de noviembre de 2017 18:58
    miércoles, 8 de noviembre de 2017 3:02
  • Muchas gracias por tu ayuda Marcelo,

    he tratado de hacer algo como lo que me sugeriste y aún no me abre el form

                    Dim Str As String = Convert.ToString(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
                    'BUSCAR LA CLAVE
                    Dim queryExiste As String = "SELECT * FROM tabla WHERE claveExam = @claveExam"
                    Dim cmdExiste As SqlCommand = New SqlCommand(queryExiste, conexion)
                    cmdExiste.Parameters.AddWithValue("@claveExam", Str)
    
                    Using myReaderExiste As SqlDataReader = cmdExiste.ExecuteReader
    
                        If myReaderExiste.Read Then
    
                            'SI EXISTE FORMATO SE CARGA
                            cmdExiste.CommandText = queryExiste
    
                                If myReaderExiste.HasRows = True Then
      'COMPARAR EL VALOR DE LA CELDA DEL DGV CON LA CLAVE DEL QUERY
                                    If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = Str Then
    
                                    formPersonalizado.TituloExamTextBox.Text = myReaderExiste.Item("tituloExam").ToString
    formPersonalizado.exam1.Text = myReaderExiste.Item("exam1").ToString   
    formPersonalizado.exam2.Text = myReaderExiste.Item("exam2").ToString                              
    
                                    formPersonalizado.Show()
                                    End If
                                End If
                            End If
                    End Using

    Seguiré intentando, tiene que salir.

    Muchas gracias por tu aporte

    Saludos




    jueves, 9 de noviembre de 2017 21:03