none
enlazar dos combobox y dos textbox

    Pregunta

  • Hola a todos, estaba tratando de realizar lo siguiente, tengo dos combobox anidados que que funcionan correctamente, el primero es "empresa" y el segundo "proyecto" que se esta realizando a esa empresa, luego tengo dos textbox "fondos asignados" y "fondos restantes", al elegir una empresa y el proyecto que se esta realizando deberia mostrarme en los textbox los fondos asignados y los fondos restantes. Estaba siguiendo una referencia muy bien explicada de don Leandro [WinForms] ComboBox Anidados, pero en ella solo hace referencia a los combobox y no a los textbox. lo he intentado de una y otra forma pero solo me muextra el centro de costo asociado a los proyectos, proveniente de el combobox proyecto (value member: centro_de_costo, displaymember: Descripcion_proyecto). Les dejo el codigo de ante mano gracias.

    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Drawing
    Imports System.Linq
    Imports System.Text
    Imports System.Windows.Forms
    Imports Datos
    Imports System.Data.SqlClient
    Imports System.Data.Sql
    
    Public Class Solicitud_Fondos
        Inherits Form
        Dim cmd As New SqlCommand
        Dim cn As New SqlConnection(My.Settings.Conexion_Rendiciones)
        Public Sub New()
        InitializeComponent()
        End Sub
        Private Sub Solicitud_Fondos_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            load_cbx_cliente()
            MaximizeBox = False
            MinimizeBox = False
    
            'Ver Fondos Proyecto Seleccionado
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Connection = (cn)
            cmd.CommandText = ("SP_Fondos_Asignados")
            cmd.Parameters.Add("@Fondos_Asignados", SqlDbType.VarChar, 20)
        End Sub
    
        Private Sub cbx_cliente_SelectionChangeCommitted(sender As Object, e As System.EventArgs) Handles cbx_cliente.SelectionChangeCommitted
            Dim Cliente_RUT As String = Convert.ToString(cbx_cliente.SelectedValue)
            load_cbxNombreProyecto(Cliente_RUT)
        End Sub
    
        Private Sub load_cbx_cliente()
            cbx_Cliente.DataSource = Conexion.Listar_Clientes()
            cbx_Cliente.DisplayMember = "Nombre"
            cbx_Cliente.ValueMember = "ClienteRut"
            If cbx_Cliente.Items.Count <> 0 Then
                Dim Cliente_RUT As String = Convert.ToString(cbx_Cliente.SelectedValue)
                load_cbxNombreProyecto(Cliente_RUT)
            Else
                cbx_proyecto.DataSource = Nothing
            End If
        End Sub
    
        Private Sub load_cbxNombreProyecto(ByVal Cliente_RUT As String)
            cbx_proyecto.DataSource = Conexion.ListarProyectos(Cliente_RUT)
            cbx_proyecto.DisplayMember = "Descripcion_Proyecto"
            cbx_proyecto.ValueMember = "Centro_Costo"
            If cbx_Cliente.Items.Count <> 0 Then
                Dim Proyecto_CentroCosto As String = Convert.ToString(cbx_proyecto.SelectedValue)
            End If
        End Sub
    
        Private Sub cbx_proyecto_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cbx_proyecto.SelectedIndexChanged
            
        End Sub
    
        Private Sub txt_fondos_asignados_TextChanged(sender As System.Object, e As System.EventArgs) Handles txt_fondos_asignados.TextChanged
    
        End Sub

    miércoles, 4 de enero de 2017 20:13

Respuestas

  • ya solucione el problema, dejo el código de todos modos muchas gracias willams.

    Private Sub cbx_proyecto_SelectionChangeCommitted(sender As Object, e As System.EventArgs) Handles cbx_proyecto.SelectionChangeCommitted
            Try
                Dim str As String = "SELECT Fondos_Asignados, Fondos_Restantes FROM Tbl_Proyecto WHERE Centro_Costo LIKE @Centro_Costo"
                Dim cmd As New SqlCommand(str, cn)
                cmd.Parameters.AddWithValue("@Centro_Costo", CStr(cbx_proyecto.SelectedValue))
                Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
                Dim dt As New DataTable
                da.Fill(dt)
                If dt.Rows.Count > 0 Then
                    Dim row As DataRow = dt.Rows(0)
                    txt_fondos_asignados.Text = CStr(row("Fondos_Asignados"))
                    txt_fondos_restantes.Text = CStr(row("Fondos_Restantes"))
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

    jueves, 5 de enero de 2017 13:57

Todas las respuestas

  • adriian.91,

    ¿Dónde es que contienes los datos de fondos asignados y fondos restantes?

    Por cada vez que el usuario seleccione un elemento del desplegable de proyectos (evento SelectionChangeCommitted) debes recuperar los datos de la(s) tabla(s) correspondientes.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 4 de enero de 2017 20:39
  • Williams, estan almacenados en una tabla llamada "tbl_proyectos", que contiene entre otros campos: "centro_costo, PK", "Fondos_signados", "Fondos_Restantes", "Rut_Cliente, FK".  Cree un SP, que busca los fondos asignados y restantes de dicha tabla, asociados a su Centro de Costo. Cuando lo ejecuto en SQLserver, funciona bien, pero cuando lo ejecuto en vb.net, me muestra el centro de costo y no los fondos asignados, ni los restantes. Debo estar omitiendo algo. favor ayuda

    Create PROCEDURE [dbo].[SP_Fondos_Asignados] 
    	@Fondos_Asignados varchar(20)
    AS
    BEGIN
    	SET NOCOUNT ON;
    	select Fondos_Asignados from Tbl_Proyecto where Centro_Costo =@Fondos_Asignados
    END

    • Editado adriian.91 miércoles, 4 de enero de 2017 20:54
    miércoles, 4 de enero de 2017 20:51
  • adriian.91,

    El procedimiento que adjuntas sólo selecciona los valores de la columna Fondos_Asignados, ¿cómo es que obtienes las demás columnas?

    En cualquier caso, lo que tienes que haces es obtener dichos valores a partir del elemento seleccionado en el desplegable de proyectos, algo como:

    Private Sub cbx_proyecto_SelectionChangeCommitted(sender As Object, e As EventArgs)
    
    	Dim CentroCosto As Integer = CInt(DirectCast(sender, ComboBox).SelectedValue)
    
    	Dim Valores = ObtenerFondos(CentroCosto) 'Función que retorna una lista de tipo decimal
    
    	If Valores IsNot Nothing Then
    		txtFondosAsignados.Text = Valores(0) 'Se asigna el primer elemento
    		txtFondosRestantes.Text = Valores(1) 'Se asigna el segundo elemento
    	End If
    
    End Sub

    La función deberá ser similar a lo siguiente:

    Private Function ObtenerFondos(CentroCosto As Integer) As List(Of Decimal)
    
    	Dim Fondos As New List(Of Decimal)
    
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSql = "SELECT Fondos_Asignados, Fondos_Restantes 
    			FROM Tbl_Proyecto WHERE Centro_Costo = @Centro_Costo"
    
    		Dim cmd As New SqlCommand(ConsultaSql, cn)
    
    		cmd.Parameters.AddWithValue("@Centro_Costo", CentroCosto)
    		cn.Open()
    
    		Dim dr As SqlDataReader = cmd.ExecuteReader
    
    		If dr.Read Then
    			Fondos.Add(dr.GetDecimal(0))
    			Fondos.Add(dr.GetDecimal(1))
    		End If
    	End Using
    
    	Return Fondos
    
    End Function



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.


    jueves, 5 de enero de 2017 0:42
  • Willams , disculpa mi torpeza pero la columna "centro_costo" es varchar y no integer, al cambiar el tipo el codigo me arroja error aquí

    Dim CentroCosto As Integer = CInt(DirectCast(sender, ComboBox).SelectedValue)-->La conversión de la cadena "sams201701" en el tipo 'Integer' no es válida.

    Al convertirlo a string me arroja un error aqui

    Dim CentroCosto As String = Convert.ToString(cbx_proyecto.SelectedValue)
    
            Dim Valores = ObtenerFondos(CInt(CentroCosto)) -->La conversión de la cadena "sams201701" en el tipo 'Integer' no es válida.

    • Editado adriian.91 jueves, 5 de enero de 2017 12:48
    jueves, 5 de enero de 2017 12:45
  • ya solucione el problema, dejo el código de todos modos muchas gracias willams.

    Private Sub cbx_proyecto_SelectionChangeCommitted(sender As Object, e As System.EventArgs) Handles cbx_proyecto.SelectionChangeCommitted
            Try
                Dim str As String = "SELECT Fondos_Asignados, Fondos_Restantes FROM Tbl_Proyecto WHERE Centro_Costo LIKE @Centro_Costo"
                Dim cmd As New SqlCommand(str, cn)
                cmd.Parameters.AddWithValue("@Centro_Costo", CStr(cbx_proyecto.SelectedValue))
                Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
                Dim dt As New DataTable
                da.Fill(dt)
                If dt.Rows.Count > 0 Then
                    Dim row As DataRow = dt.Rows(0)
                    txt_fondos_asignados.Text = CStr(row("Fondos_Asignados"))
                    txt_fondos_restantes.Text = CStr(row("Fondos_Restantes"))
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

    jueves, 5 de enero de 2017 13:57
  • adriian.91,

    Respecto al error que adjuntas, es claro que el tipo del parámetro CentroCosto (del método ObtenerFondos()) debería ser cambiado a String, con ello dejabas de obtener el error.

    Respecto al código que presentas, ¿dónde tienes declarado la variable cn? ¿usas conexiones de ámbito de clase o global? Si es así olvida esa mala practica y toma en consideración el ejemplo que te propuse donde se enmarca claramente el uso de una conexión a base de datos.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 5 de enero de 2017 16:48