none
Falhas Combobox RRS feed

  • Pergunta

  • Eu estou desenvolvendo uma aplicação em VB 2012, e em um formulário eu estou com problemas para carregar os combobox. Primeiro, há um combobox com a Categoria, e há um segundo com os produtos, o segundo só deve carregar os produtos relacionados a categoria selecionada. Mas não está carregando. Alguém poderia me dizer onde estou errando, por favor??? Segue o código:

    Public Sub BindcboCategoria()
            Dim cn As New SqlConnection
            Dim status As String = ""
            Dim ds As New DataSet
            Dim da As New SqlDataAdapter
            Dim sql As String = ""
            cboCategoria.DataSource = ds.Tables("Categoria")
            cboCategoria.DisplayMember = "CategoriaNome"
            sql = "SELECT * FROM Categoria ORDER BY CategoriaNome"
        End Sub

        Public Sub BindcboProduto()
            Dim cn As New SqlConnection
            Dim status As String = ""
            Dim ds As New DataSet
            Dim da As New SqlDataAdapter
            Dim sql As String = ""
            cboProduto.DataSource = ds.Tables("Produto")
            cboProduto.DisplayMember = "PRODUTONOME"
            sql = "SELECT * FROM PRODUTO WHERE CATEGORIAID = '" & Me.cboCategoria.Text & "'ORDER BY PRODUTONOME'"
        End Sub

    segunda-feira, 20 de outubro de 2014 13:02

Respostas

  • Uma opção é passar o combobox como parâmetro veja ai:

    Public Class Popular_Combo Public Sub BindcboCategoria(ByVal combo As ComboBox) Dim cx As New Conexao Dim sql As String = ""

    Dim dados As New DataTable cx.conectar() sql = "SELECT * FROM Categoria ORDER BY CategoriaNome" Dim cmd As New SqlCommand cmd.CommandText = sql cmd.Connection = cx.cn Dim dr As SqlDataReader = cmd.ExecuteReader

    dados.Load(dr) combo.DataSource = dados combo.DisplayMember = "CategoriaName" combo.ValueMember = "CategoriaCod" End Sub Public Sub BindcboProduto(ByVal combo As ComboBox) Dim cx As New Conexao Dim sql As String = ""

    Dim dados As New DataTable

    cx.conectar() sql = "SELECT * FROM Produto ORDER BY ProdutoNome" Dim cmd As New SqlCommand cmd.CommandText = sql cmd.Connection = cx.cn Dim dr As SqlDataReader = cmd.ExecuteReader

    dados.Load(dr) combo.DataSource = dados combo.DisplayMember = "Produto" combo.ValueMember = "codigo" End Sub End Class

    E para chamar no seu evento seria assim:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
             Dim chamarcombo As New Popular_Combo
             chamarcombo.BindcboCategoria(cboCategoria)
         End Sub






    • Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 16:05
    • Marcado como Resposta Ronaldo.Pinheiro segunda-feira, 20 de outubro de 2014 18:11
    • Editado Mr. GMSOFT segunda-feira, 20 de outubro de 2014 18:16
    segunda-feira, 20 de outubro de 2014 16:05

Todas as Respostas

  • Onde é chamado BindcboProduto?

    Para que funcione, vc tem que executar esse metodo toda vez que altera categoria... 

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 13:37
    • Não Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 13:37
    • Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 13:38
    • Não Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 15:59
    segunda-feira, 20 de outubro de 2014 13:26
    Moderador
  • William

    Entendi. Vou alterar para ver se funciona. Qualquer novidade eu respondo após a alteração.

    segunda-feira, 20 de outubro de 2014 13:38
  • Willian

    Eu mudei um pouco o código e criei uma Classe chamada Popular_Combo.

    Imports System.Data.SqlClient
    Public Class Popular_Combo
        Public Sub BindcboCategoria()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Categoria ORDER BY CategoriaNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
        End Sub
        Public Sub BindcboProduto()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Produto ORDER BY ProdutoNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
        End Sub
    End Class

    E no formulário eu coloquei assim chamando o BindcboCategoria:

        Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria()
        End Sub

    E continua retornando vazio o Combobox.Não estou entendendo onde eu estou errando.


    segunda-feira, 20 de outubro de 2014 14:45
  • No cbocategoria vc recarrega categoria?

    Voce tem que carregar Produto

       Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            'chamarcombo.BindcboCategoria()  - esta errado
            chamarcombo.BindcboProduto()
        End Sub
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 20 de outubro de 2014 15:21
    Moderador
  • Eu sei William. Mas não está populando nem a Categoria. Eu estou tentando resolver um problema por vez. Creio que se conseguir popular categoria eu consigo produto.
    segunda-feira, 20 de outubro de 2014 15:25
  • Ok.. em nenhum momento vc especificou que seu problema era com a combo Categoria. Quem le, acha que o problema é com produtos.

    Note... a categoria tem que ser chamado no load do Form... Depois a cada modificaçao de categoria vc recarrega produtos.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    segunda-feira, 20 de outubro de 2014 15:29
    Moderador
  • William

    Esse código está no FORM_LOAD

       Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria()
        End Sub

    Pelo que eu entendo, deveria funcionar. Mas não carrega nada. Meu problema todo é esse, ele não carrega nada.

    segunda-feira, 20 de outubro de 2014 15:42
  • Poste aqui o form_load... o que vc postou foi o "cboCategoria_SelectedIndexChanged"

    E isso nao faz sentido.. o que vc esta fazendo ai é dizer que a cada modificaçao de categoria recarregue categoria.. ou seja, é como um cachorro correndo atras do proprio rabo.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 20 de outubro de 2014 15:45
    Moderador
  • Está faltando setar o DataSource, alterei a classe para retornar o DataReader:

    Imports System.Data.SqlClient
    Public Class Popular_Combo
        Public Function BindcboCategoria() as SqlDataReader
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Categoria ORDER BY CategoriaNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
            Return dr
        End Function
        Public Function BindcboProduto() as SqlDataReader
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Produto ORDER BY ProdutoNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
            Return dr
        End Function
    End Class

    E passei a setar o DataSource:

      Dim chamarcombo As New Popular_Combo
      cboCategoria.DataSource =      chamarcombo.BindcboCategoria()
       cboCategoria.DisplayMember = "CategoriaNome"

    Marque se foi útil!

    • Sugerido como Resposta Deric Ferreira segunda-feira, 20 de outubro de 2014 15:48
    segunda-feira, 20 de outubro de 2014 15:48
  • Willian

    Eu mudei um pouco o código e criei uma Classe chamada Popular_Combo.

    Imports System.Data.SqlClient
    Public Class Popular_Combo
        Public Sub BindcboCategoria()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Categoria ORDER BY CategoriaNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
        End Sub
        Public Sub BindcboProduto()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Produto ORDER BY ProdutoNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
        End Sub
    End Class

    E no formulário eu coloquei assim chamando o BindcboCategoria:

        Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria()
        End Sub

    E continua retornando vazio o Combobox.Não estou entendendo onde eu estou errando.



    Em que momento você chamou o cboCategoria para receber os dados do seu SQL??
    • Editado Mr. GMSOFT segunda-feira, 20 de outubro de 2014 15:50
    segunda-feira, 20 de outubro de 2014 15:50
  • Wiliam segue os códigos:

    Classe:

    Imports System.Data.SqlClient
    Public Class Popular_Combo
        Public Sub BindcboCategoria()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Categoria ORDER BY CategoriaNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
            Return
        End Sub
        Public Sub BindcboProduto()
            Dim cx As New Conexao
            Dim sql As String = ""
            cx.conectar()
            sql = "SELECT * FROM Produto WHERE CATEGORIAID = '" & Entrada.cboCategoria.Text & "' ORDER BY ProdutoNome"
            Dim cmd As New SqlCommand
            cmd.CommandText = sql
            cmd.Connection = cx.cn
            Dim dr As SqlDataReader = cmd.ExecuteReader
            Return
        End Sub
    End Class

    Agora o FORM_LOAD

    Public Class Entrada
        Private Sub Entrada_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'SindifortDataSet.FORNECEDOR' table. You can move, or remove it, as needed.
            Me.FORNECEDORTableAdapter.Fill(Me.SindifortDataSet.FORNECEDOR)
            'TODO: This line of code loads data into the 'SindifortDataSet.PRODUTO' table. You can move, or remove it, as needed.
            Me.PRODUTOTableAdapter.Fill(Me.SindifortDataSet.PRODUTO)
            'TODO: This line of code loads data into the 'SindifortDataSet.Categoria' table. You can move, or remove it, as needed.
            Me.CategoriaTableAdapter.Fill(Me.SindifortDataSet.Categoria)
            'TODO: This line of code loads data into the 'SindifortDataSet.ENTRADA' table. You can move, or remove it, as needed.
            Me.ENTRADATableAdapter.Fill(Me.SindifortDataSet.ENTRADA)
            Dim chamarcombo As New Popular_Combo
            
        End Sub

        Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria()
        End Sub
    End Class

    segunda-feira, 20 de outubro de 2014 16:02
  • Uma opção é passar o combobox como parâmetro veja ai:

    Public Class Popular_Combo Public Sub BindcboCategoria(ByVal combo As ComboBox) Dim cx As New Conexao Dim sql As String = ""

    Dim dados As New DataTable cx.conectar() sql = "SELECT * FROM Categoria ORDER BY CategoriaNome" Dim cmd As New SqlCommand cmd.CommandText = sql cmd.Connection = cx.cn Dim dr As SqlDataReader = cmd.ExecuteReader

    dados.Load(dr) combo.DataSource = dados combo.DisplayMember = "CategoriaName" combo.ValueMember = "CategoriaCod" End Sub Public Sub BindcboProduto(ByVal combo As ComboBox) Dim cx As New Conexao Dim sql As String = ""

    Dim dados As New DataTable

    cx.conectar() sql = "SELECT * FROM Produto ORDER BY ProdutoNome" Dim cmd As New SqlCommand cmd.CommandText = sql cmd.Connection = cx.cn Dim dr As SqlDataReader = cmd.ExecuteReader

    dados.Load(dr) combo.DataSource = dados combo.DisplayMember = "Produto" combo.ValueMember = "codigo" End Sub End Class

    E para chamar no seu evento seria assim:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
             Dim chamarcombo As New Popular_Combo
             chamarcombo.BindcboCategoria(cboCategoria)
         End Sub






    • Sugerido como Resposta Mr. GMSOFT segunda-feira, 20 de outubro de 2014 16:05
    • Marcado como Resposta Ronaldo.Pinheiro segunda-feira, 20 de outubro de 2014 18:11
    • Editado Mr. GMSOFT segunda-feira, 20 de outubro de 2014 18:16
    segunda-feira, 20 de outubro de 2014 16:05
  • Deric

    Obrigado pela resposta, mas o chamarcombo.BindcboCategoria() como DataSource dá erro Expression does not produce a value.

    segunda-feira, 20 de outubro de 2014 16:07
  • MAs seu form load nao chama o metodo BindcboCategoria... o correto é mais ou menos assim:

    Private Sub Entrada_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'SindifortDataSet.FORNECEDOR' table. You can move, or remove it, as needed.
            Me.FORNECEDORTableAdapter.Fill(Me.SindifortDataSet.FORNECEDOR)
            'TODO: This line of code loads data into the 'SindifortDataSet.PRODUTO' table. You can move, or remove it, as needed.
            Me.PRODUTOTableAdapter.Fill(Me.SindifortDataSet.PRODUTO)
            'TODO: This line of code loads data into the 'SindifortDataSet.Categoria' table. You can move, or remove it, as needed.
            Me.CategoriaTableAdapter.Fill(Me.SindifortDataSet.Categoria)
            'TODO: This line of code loads data into the 'SindifortDataSet.ENTRADA' table. You can move, or remove it, as needed.
            Me.ENTRADATableAdapter.Fill(Me.SindifortDataSet.ENTRADA)
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria() ' chamar o metodo aqui
        End Sub

    esse trecho:

      Private Sub cboCategoria_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCategoria.SelectedIndexChanged
            Dim chamarcombo As New Popular_Combo
            chamarcombo.BindcboCategoria()
        End Sub
    End Class

    nao faz sentido!!!

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 20 de outubro de 2014 16:08
    Moderador
  • Veja minha resposta assim que funciona
    segunda-feira, 20 de outubro de 2014 16:13
  • William

    Irei corrigir o código e assim que tiver o resultado eu respondo.

    segunda-feira, 20 de outubro de 2014 16:42
  • Mr. GMSOFT

    Boa Tarde

    Grande, o script retorna 

    Warning 1 Variable 'dados' is used before it has been assigned a value. A null reference exception could result at runtime.
    segunda-feira, 20 de outubro de 2014 17:18
  • Coloque assim onde tiver dados:

    Dim dados as New DataTable

    segunda-feira, 20 de outubro de 2014 17:33
  • Mr. GMSOFT

    Valeu cara. Resolvido. Muito obrigado pela ajuda.

    segunda-feira, 20 de outubro de 2014 17:49
  • Marca a resposta, blz
    segunda-feira, 20 de outubro de 2014 18:10
  • Marcado.
    segunda-feira, 20 de outubro de 2014 18:12