none
VS2003 - Listbox preenchendo em tempo real RRS feed

  • Pergunta

  • Ola pessoal,

    Coisa bem simples que eu estou em dúvida de como fazer. Tenho uma tela com dois listbox:

    lstAptos
    lstInaptos

    Preciso preenchelos, para posteriormente gerar dois relatórios diferentes, buscando os candidatos por código na base de dados. O objetivo é simples consultar na base e verificar se esta APTO ou INAPTO e então escolher o listbox e preencher, eu estava tentando fazer desta maneira:

    Dim dr As SqlDataReader = cm.ExecuteReader(CommandBehavior.CloseConnection)

    If dr.HasRows Then

    dr.Read()

    lstAptos.DisplayMember = dr("Nome")

    lstAptos.ValueMember = dr("Codigo")

    End If

    Mas percebi que não aparece os dados do candidato, acredito eu por não ter um DataSource definido. Qual seria a forma de resolver isto ????

    OBS: Não gostaria de usar a classe MeuItemData.

    quinta-feira, 29 de junho de 2006 19:56

Respostas

  • Ricardo,

    DisplayMember e ValueMember são usados para DataBinding, não para inserir um item no ListBox. Se você quer vincular os dados de uma pesquisa ao ListBox não vai poder ser com um DataReader. DataReader não suporta DataBinding em Windows Forms, teria que ser com um DataTable no caso, algo como:

    Dim da As New SqlDataAdapter(cm)
    Dim ds As New DataSet()

    da.Fill(ds, "SuaTabela")

    lstAptos.DisplayMember = "Nome"
    lstAptos.ValueMember = "Codigo"
    lstAptos.DataSource = ds.Tables("SuaTabela")

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 29 de junho de 2006 20:06
    Moderador
  • Achei o caminho.... Vlw

    dr.Read()

    Dim DataRow As DataRow = dt.NewRow

    DataRow("Codigo") = dr("Codigo")

    DataRow("Nome") = dr("Nome")

    dt.Rows.Add(DataRow)

    lstAptos.DisplayMember = "Nome"

    lstAptos.ValueMember = "Codigo"

    lstAptos.DataSource = dt

    quinta-feira, 29 de junho de 2006 20:29
  • Ricardo,

    O ideal seria usar uma coleção então onde você iria adicionando instancias de uma classe a medida que o usuário vai selecionando seus dados e tal, mas parece que você não quer fazer assim por algum motivo, certo?

    Você poderia então criar um DataSet no escopo do seu form e a cada retorno da pesquisa você faz um Merge do DataSet que chegou com o DataSet que está no escopo do seu form.

    Por exemplo, adicione um ListBox e um botão no seu Form.No escopo do seu form declare o seguinte:

    Private mds As DataSet

    No evento Load, faça o seguinte:

    ' Aqui eu vou criar manualmente o DataTable, mas ele poderia
    ' ser resultado da mesma query que você vai fazer aí para obter
    ' os novos elementos. Na verdade ele tem que ter a mesma estrutura
    ' que esta query vai devolver mesmo.
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "Codigo", GetType(Integer))
    dt.Columns.Add(
    "Nome", GetType(String))
    ' Vou simular como se já houvessem dados...
    dt.Rows.Add(New Object() {1, "Nome Um"})
    dt.Rows.Add(
    New Object() {1, "Nome Dois"})
    dt.Rows.Add(
    New Object() {1, "Nome Tres"})

    mds =
    New DataSet()
    mds.Tables.Add(dt)

    ' Aqui eu vinculo o ListBox...
    ListBox1.DisplayMember = "Nome"
    ListBox1.ValueMember = "Codigo"
    ListBox1.DataSource = mds.Tables("Exemplo")

    No evento Click do botão, escreva o código abaixo:

    ' Aqui eu vou simular como se tivesse recebido um dataset
    ' de mesma estrutura com um dado a mais...
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "Codigo", GetType(Integer))
    dt.Columns.Add("Nome", GetType(String))

    ' Vou simular como se já houvessem dados...
    Dim r As New Random()
    dt.Rows.Add(
    New Object() {r.Next(1, 100), "Dado a mais"})

    Dim ds As New DataSet()
    ds.Tables.Add(dt)

    ' Aí aqui viria o merge...
    mds.Merge(ds, True)

    Cada vez que você apertar o botão vai aparecer um item novo, como se você tivesse feito uma busca e encontrasse algo a mais para colocar no list.

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 29 de junho de 2006 20:35
    Moderador

Todas as Respostas

  • Ricardo,

    DisplayMember e ValueMember são usados para DataBinding, não para inserir um item no ListBox. Se você quer vincular os dados de uma pesquisa ao ListBox não vai poder ser com um DataReader. DataReader não suporta DataBinding em Windows Forms, teria que ser com um DataTable no caso, algo como:

    Dim da As New SqlDataAdapter(cm)
    Dim ds As New DataSet()

    da.Fill(ds, "SuaTabela")

    lstAptos.DisplayMember = "Nome"
    lstAptos.ValueMember = "Codigo"
    lstAptos.DataSource = ds.Tables("SuaTabela")

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 29 de junho de 2006 20:06
    Moderador
  • Francisco,

    Entendi perfeitamente, não sabia que o datareader nao suportava. Tentei usá-lo, pois, eu preciso inserir a cada novo usuário....

    Explicando: tem uma listagem que vem de outro setor, e o usuário vai informando o Código do Candidato, e o sistema verifica se este esta apto e joga na lstApto, caso não, joga na lstInapto....

    Como deve ser tratado caso a caso, candidato a candidato, eu optei pelo datareader, pq usando o datatable, ele somente ficará armazenado o ultimo candidato que foi informado o código, uma vez que a cada consulta ele carrega o DataTable somente como ultimo código...

    Entende????

    Pensei em criar um DataTable com duas tabelas, e a cada consulta inserir um registro, na tabela adequada, estava tentando fazer este código agora, mas não sei como fazê-lo...

    Será que pode me ajudar??

     

    quinta-feira, 29 de junho de 2006 20:19
  • Achei o caminho.... Vlw

    dr.Read()

    Dim DataRow As DataRow = dt.NewRow

    DataRow("Codigo") = dr("Codigo")

    DataRow("Nome") = dr("Nome")

    dt.Rows.Add(DataRow)

    lstAptos.DisplayMember = "Nome"

    lstAptos.ValueMember = "Codigo"

    lstAptos.DataSource = dt

    quinta-feira, 29 de junho de 2006 20:29
  • Ricardo,

    O ideal seria usar uma coleção então onde você iria adicionando instancias de uma classe a medida que o usuário vai selecionando seus dados e tal, mas parece que você não quer fazer assim por algum motivo, certo?

    Você poderia então criar um DataSet no escopo do seu form e a cada retorno da pesquisa você faz um Merge do DataSet que chegou com o DataSet que está no escopo do seu form.

    Por exemplo, adicione um ListBox e um botão no seu Form.No escopo do seu form declare o seguinte:

    Private mds As DataSet

    No evento Load, faça o seguinte:

    ' Aqui eu vou criar manualmente o DataTable, mas ele poderia
    ' ser resultado da mesma query que você vai fazer aí para obter
    ' os novos elementos. Na verdade ele tem que ter a mesma estrutura
    ' que esta query vai devolver mesmo.
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "Codigo", GetType(Integer))
    dt.Columns.Add(
    "Nome", GetType(String))
    ' Vou simular como se já houvessem dados...
    dt.Rows.Add(New Object() {1, "Nome Um"})
    dt.Rows.Add(
    New Object() {1, "Nome Dois"})
    dt.Rows.Add(
    New Object() {1, "Nome Tres"})

    mds =
    New DataSet()
    mds.Tables.Add(dt)

    ' Aqui eu vinculo o ListBox...
    ListBox1.DisplayMember = "Nome"
    ListBox1.ValueMember = "Codigo"
    ListBox1.DataSource = mds.Tables("Exemplo")

    No evento Click do botão, escreva o código abaixo:

    ' Aqui eu vou simular como se tivesse recebido um dataset
    ' de mesma estrutura com um dado a mais...
    Dim dt As New DataTable("Exemplo")
    dt.Columns.Add(
    "Codigo", GetType(Integer))
    dt.Columns.Add("Nome", GetType(String))

    ' Vou simular como se já houvessem dados...
    Dim r As New Random()
    dt.Rows.Add(
    New Object() {r.Next(1, 100), "Dado a mais"})

    Dim ds As New DataSet()
    ds.Tables.Add(dt)

    ' Aí aqui viria o merge...
    mds.Merge(ds, True)

    Cada vez que você apertar o botão vai aparecer um item novo, como se você tivesse feito uma busca e encontrasse algo a mais para colocar no list.

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 29 de junho de 2006 20:35
    Moderador
  • Francisco,

    Não sabia que a melhor forma era usar a classe....  
    Pensei que era usar o DisplayMember e ValueMember...

    Então você recomenda usar a classe MeuItemData ??
    Que o Macoratti fez para .net ??

    Vlw pela ajuda.

    quinta-feira, 29 de junho de 2006 20:42
  • Ricardo,

    Não é que é a melhor forma, é a que lhe daria menos trabalho na ocasião aqui aparentemente. Mas você resolveu de uma forma boa também, está perfeito.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    quinta-feira, 29 de junho de 2006 22:18
    Moderador