DATASOURCE

JABA 01/07/2010 19:23:31
#346346
Olá pessoal, tenho uma fonte de dados em um controle COMBOBOX e preencho esta fonte no LOAD do Form, e tenho tambem um evento para o mesmo combobox SelectedIndexChanged pegando o item selecionado. Quando inicio o sistema, gera um erro por causa do evento SelectedIndexChanged, se eu retirar este evento, o controle é preenchido normalmente.

Alguem sabe como contornar este problema?

vlw
JONATHANSTECKER 01/07/2010 22:11:06
#346362
Poste estes 2 eventos aqui para darmos uma analisada, assim poderemos ver o que está ocorrendo.

Será que você não está atropelando as coisas no evento SelectedIndexChanged?

JABA 01/07/2010 22:46:09
#346364
O que acontece na verdade é que quando carrego os dados no combobox a partir do load do form , o evento SelectedIndexChanged do combobox tambem é acionado em conjunto com o preenchimento do combobox, ou seja, em cada linha preenchida no combobox, o evento SelectedIndexChanged é acionado, por este motivo, gera-se o erro . Agora, como contornar isso? vlw
TECLA 02/07/2010 07:56:21
#346370
Resposta escolhida
Uma sugestão é criar uma variável do tipo BOOLEAN para contornar o problema.

  • Declare a variável no FORM de forma que fique visível para todo o formulário;
  • Set a variável para FALSE no evento LOAD do FORM;
  • Quando concluir a rotina que alimenta o COMBOBOX, set a variável para TRUE;
  • Por fim, no evento SELECTEDINDEXCHANGED é só verificar se a variável possue o valor TRUE, se sim, proceda com a rotina.
  • JONATHANSTECKER 02/07/2010 08:35:14
    #346375
    JABA, este evento só é disparado quando um item é selecionado na ComboBox, se você somente preencher não irá disparar.

    Ex.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For N As Integer = 1 To 9
    Me.ComboBox1.Items.Add(N.ToString)
    Next
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    MsgBox(Me.ComboBox1.SelectedItem.ToString)
    End Sub

    Neste exemplo só irá ocorrer uma mensagem se eu selecionar um ítem.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For N As Integer = 1 To 9
    Me.ComboBox1.Items.Add(N.ToString)
    Next

    [ô] Selecionando um ítem na ComboBox
    [txt-color=#e80000] Me.ComboBox1.SelectedIndex = 0[/txt-color]

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    MsgBox(Me.ComboBox1.SelectedItem.ToString)
    End Sub

    Se você preencher a ComboBox e só selecionar o ítem quando houver necessidade... Será que resolve?

    Se não, use a idéia do Tecla. Ela funcionará de certeza.
    RICART 02/07/2010 11:33:59
    #346388
    Jaba,
    Melhor vc seguir a dica do TECLA. Tive esse mesmo problema.

    Crie uma variável boolena no módulo do formulário e utilize no load do form, indicando-a, por exemplo, como false.

    No final do load do form, passe para true.

    coloque todo o código do SelectedIndexChanged dentro de um bloco if, indicando que é para executar somente se for true.
    JABA 06/07/2010 17:25:02
    #346688
    Muito bom pessoal, eu tambem tinha pensado da forma como o Tecla falou, só queria saber se o componente tinha algum metodo para detectar isto, agora com relacao ao que JONATHANSTECKER falou, peço para verificar este mesmo codigo usando um DataSource, de qualquer forma, muito obrigado pelas respostas. vlw
    JONATHANSTECKER 06/07/2010 17:29:05
    #346690
    JABA, como você está preenchendo a ComboBox com o DataSource?
    Poderias postar aqui? Assim fica mais fácil para entender.
    JABA 09/07/2010 20:06:22
    #346980
    JONATHANSTECKER , Estou usando assim no load do form:

    dim dt as new datatable = sql () [ô]aqui é a consulta para extrair os dados do banco de dados.

    apos preencher o datatable com os dados do banco, vinculo o mesmo ao combobox, desta forma:

    ComboBox1.DataSource = dt

    Qualque duvida é soh falar. vlw

    Tópico encerrado , respostas não são mais permitidas