none
Traer registro de un datagrid RRS feed

  • Pregunta

  • Hola todos,

    Trabajo con wpf y vb.net 2010.

    Tengo un formulario principal (frmMain) mediante un boton de busqueda llamo otro: frmSearch que tiene un data grid con varios registros.

    Mi idea es seleccionar con doble click un registro o mediante un boton "Seleccionar" y los datos selecionados del frmSearch los pueda utilizar en el frmMain. En winForms usaba un codigo similar a este, pero en wpf no me funciona.

    en frmMain:

    'Se llama a busqueda
    
            Dim frm As New frmBuscaFact()
    
            If frm.ShowDialog() = DialogResult.OK Then
    
                ' Mantengo la entidad egreso seleccionada global al formulario
                txtTotalNeto.Text = 0
                vFacturas = Nothing
    
                vFacturas = FacturasBL.TraeFACT(vid_cosecha, frm.tipoDoc, frm.prefijo, frm.Consecutivo)
                If vFacturas Is Nothing Then
                    Exit Sub
                End If

    y en frmSearch:

    Public Class frmBuscaFact
        Inherits Form
        Private _tipo_doc As String
        Private _prefijo As String
        Private _num_doc As Integer
    
        Dim vfecha As Date = Nothing
        Dim vData As DataTable = Nothing
        Dim vSwInicio As Boolean = True
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public ReadOnly Property tipoDoc() As String
            Get
                Return _tipo_doc
            End Get
        End Property
        Public ReadOnly Property prefijo() As String
            Get
                Return _prefijo
            End Get
        End Property
        Public ReadOnly Property Consecutivo() As Integer
            Get
                Return _num_doc
            End Get
        End Property
    
    Private Sub btnSeleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSeleccionar.Click
    
            _tipo_doc = Convert.ToString(dgvSearch.CurrentRow.Cells("cTipo_doc").Value)
            _num_doc = Convert.ToInt32(dgvSearch.CurrentRow.Cells("cnum_doc").Value)
            _prefijo = Convert.ToString(dgvSearch.CurrentRow.Cells("cPref_num_doc").Value)
    
            Me.DialogResult = DialogResult.OK
            Me.Close()
    
        End Sub

    Pero no sé como implementarlo en wpf.

    ¿Cual es la mejor manera de resolver esto? 

    Les agradezco su colaboración.


    Saludos, Solph.


    • Editado Solp viernes, 30 de noviembre de 2012 11:21
    jueves, 29 de noviembre de 2012 19:25

Respuestas

  • Hola a todos los que necesiten esto:

    Ya encontré como hacerlo:

    he aquí el código en la ventana hija:

     Private _id As String
    
        Public ReadOnly Property id_grupo() As String
            Get
                Return _id
            End Get
        End Property

       Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnOk.Click
            Dim row As DataRowView = TryCast(dgSearch.SelectedItem, DataRowView)
    
            _id = row(0).ToString
    
            DialogResult = True
            Me.Close()
        End Sub

    primero obtengo la fila seleccionada del datagrid (resaltado en negrita)

    luego en la variable definida le asigno la columna de la fila seleccionada (en base cero '0', donde 0 es la primera columna)

    en este caso selecciono la primera columna y listo!

    Gracias a los que intentaron ayudarme o buscaron formas de hacerlo.

    Para los que necesiten he aquí la respuesta.


    Saludos, Solph.

    • Marcado como respuesta Solp viernes, 30 de noviembre de 2012 22:09
    viernes, 30 de noviembre de 2012 22:09

Todas las respuestas

  • hola, puedes usar un childwindow para tu ventana frmsearch, posteo codigo de ejemplo:

    '----------------------------
    'este codigo va en la ventana padre
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button4.Click
            Dim loginWnd As New miChildWindow()
            AddHandler loginWnd.Closed, AddressOf loginWnd_Closed
    
    
            loginWnd.Show()
        End Sub
    
    Private Sub loginWnd_Closed(ByVal sender As System.Object, ByVal e As EventArgs)
            Dim lw As miChildWindow = CType(sender, miChildWindow)
    
            Me.txtMensaje.Text = "RESPUESTA DE LA VENTANA HIJA" + vbCrLf
            If lw.DialogResult = True AndAlso lw.txbUsuario.Text <> String.Empty Then
                Me.txtMensaje.Text += "Hola: " + lw.txbUsuario.Text
            ElseIf (lw.DialogResult = False) Then
                Me.txtMensaje.Text += "Login cancelado"
            End If
    
    End Sub
    
    
    '----------------------------
    'este codigo va en la ventana hija
    
    Partial Public Class miChildWindow
        Inherits ChildWindow
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Private Sub OKButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles OKButton.Click
            Me.DialogResult = True
        End Sub
    
        Private Sub CancelButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles CancelButton.Click
            Me.DialogResult = False
        End Sub
    
        Private Sub ChildWindow_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            If Me.DialogResult = True AndAlso (Me.txbUsuario.Text = String.Empty OrElse Me.txbContrasenia.Password = String.Empty) Then
                e.Cancel = True
                Dim cw As New ChildWindow
                cw.Content = "Por favor digite su usuario y contraseña!!!"
                cw.Show()
            End If
    
        End Sub
    End Class

    en este codigo de ejemplo tengo dos textbox en la ventana hija, y muestro como pasar el valor de un textbox a la ventana padre al cerrar la ventana hija, espero te sirva, en todo caso creo que deberias usar un childwindow y adapatarlo a tu caso, saludos


    "La imaginacion es mas importante que el conocimiento." -> Albert Einstein


    • Editado gblumen viernes, 30 de noviembre de 2012 19:09
    • Propuesto como respuesta gblumen viernes, 30 de noviembre de 2012 19:17
    • Votado como útil Solp viernes, 30 de noviembre de 2012 21:51
    viernes, 30 de noviembre de 2012 19:08
  • hola gblumen,

    Gracias por tu respuesta... veo que me puede ser útil para otros casos. No obstante, mi situación es un tanto diferente:

    Observa que en mi ventana hija tengo los datos en un datagrid con varias columnas y necesito pasar la información de una celda ejemplo "codigo"

    y con eso llamar un procedimiento que me trae otros campos relacionados y lleno textbox en la ventana padre.

    Lo que no sé como hacer es esto:

    tomar la información de la columna deseada del datagrid de la ventana hija (y convertirla a string si se necesita, supongo) y pasarla a la ventana padre.

    Agradezco tu ayuda en este punto.


    Saludos, Solph.

    viernes, 30 de noviembre de 2012 21:51
  • Hola a todos los que necesiten esto:

    Ya encontré como hacerlo:

    he aquí el código en la ventana hija:

     Private _id As String
    
        Public ReadOnly Property id_grupo() As String
            Get
                Return _id
            End Get
        End Property

       Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnOk.Click
            Dim row As DataRowView = TryCast(dgSearch.SelectedItem, DataRowView)
    
            _id = row(0).ToString
    
            DialogResult = True
            Me.Close()
        End Sub

    primero obtengo la fila seleccionada del datagrid (resaltado en negrita)

    luego en la variable definida le asigno la columna de la fila seleccionada (en base cero '0', donde 0 es la primera columna)

    en este caso selecciono la primera columna y listo!

    Gracias a los que intentaron ayudarme o buscaron formas de hacerlo.

    Para los que necesiten he aquí la respuesta.


    Saludos, Solph.

    • Marcado como respuesta Solp viernes, 30 de noviembre de 2012 22:09
    viernes, 30 de noviembre de 2012 22:09