Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Combobox DataGrid {Resolvido}

Mensagens Recomendadas

bioshock

Boas povo,

Trago-vos um problema. Bem, é o seguinte: Eu precisava de preencher a minha datagrid com os valores relativos a cada Cliente e até aqui tudo bem. O problema é quando na datagrid existem campos como: "IDEstadoCivil" que estão ligados a outras tabelas, assim sendo o texto que aparece neste campo é " 1" , "2", "3" ou "4".

E eu queria que aparecesse  "Solteiro, Casado, Divorciado, Viúvo", percebem?

Pronto, andei a pesquisar e descobri que era impossível (pelos artigos que li) alterar um objecto em "run-time", por exemplo, alterar de Textbox para Combobox. Feito isto, primeiramente eliminamos a coluna e só depois é que a criamos novamente, já como combobox.

O código abaixo demonstra o que tenho andado a fazer para preencher a combobox:

        
        ' Remove as colunas existentes;
        Me.DataGridView1.Columns.Remove("IDEstadoCivil")

        ' Cria as novas colunas;
        Dim CriaEstadoCivil As New DataGridViewComboBoxColumn()

        ' Atribui-lhes os Nomes;
        CriaEstadoCivil.Name = "Estado Civil"

        ' Atribui-lhes os Headers;
        CriaEstadoCivil.HeaderText = "Estado Civil"

        ' Adiciona à DataGridView as novas colunas;
        DataGridView1.Columns.Add(CriaEstadoCivil)

        ' -- Vamos agora preencher as combobox com a informação das suas tabelas principais; -- '

        ' Selecciona a Base de Dados;
        Dim BaseDados As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\BD.mdb"
        ' Cria uma query;
        Dim query As String = "SELECT IDEstadoCivil FROM TClientes WHERE IDClientes = 1"
        ' Associa a connection à Base de Dados;
        Dim connection As New OleDbConnection(BaseDados)
        ' Cria o comando;
        Dim command As New OleDbCommand
        ' Cria uma DataAdapter;
        Dim DataAdapter As New OleDbDataAdapter
         ' Cria uma tabela;
        Dim Table As New DataTable
        ' Fazemos um try;
        Try
            ' Abre a connection;
            connection.Open()
            ' Associa o comando à connection;
            command.Connection = connection
            ' Associa o comando à query;
            command.CommandText = query
            ' Associa o DataAdapter ao comando;
            DataAdapter.SelectCommand = command
            ' Preenchemos a tabela;
            DataAdapter.Fill(Table)
           ' Preenchemos a combobox em questão com os elementos da tabela;
            With CriaEstadoCivil
                .DataSource = Table
                .DisplayMember = "EstadoCivil"
                .ValueMember = "IDEstadoCivil"
                ' Vamos verificar se existe registo na base de dados;
                If Table2.Rows(0).Item("IDEstadoCivil").ToString() = "" Then
                    ' Se não existir, definimos o SelectedValue como 0;
                    .Selected = 0
                Else
                    ' Caso exista, associamos ao SelectedValue o valor do campo na base de dados;
                    .Selected = Table2.Rows(0).Item("IDEstadoCivil").ToString()
                End If
            End With
            ' Caso dê erro:
        Catch SQLError As OleDb.OleDbException
            MsgBox("Erro de leitura na Base de dados : " & SQLError.Message)
        End Try
        ' Fechamos a connection;
        connection.Close()
        connection = Nothing
        command = Nothing
        

Cria as colunas com sucesso, mas não preenche as comboboxs...alguém tem alguma solução? Obrigado!  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Sim a lógica é essa...

Primeiro definir o datasource do datagrid, depois disso, removes a coluna original do estado civil e adicionas uma nova do tipo combobox

Em que o

DataPropertyName="nomeTabelaOriginal"

DataSource = "TabelaDestino"

DisplayMember="NomeDoCampoTextoTabelaDestino"

ValueMember="NomeDoCampoIDTabelaDestino"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Bem, posso estar a fazer algo de errado, mas atendendo ao que me disseste, fiz:

                 ' Tabela principal;
                .DataPropertyName = "TClientes"
                 ' Subtabela (EstadoCivil);
                .DataSource = Table
                 ' Descrição;
                .DisplayMember = "EstadoCivil"
                 ' ID;
                .ValueMember = "IDEstadoCivil"

No entanto diz-me que: " O campo denominado EstadoCivil, não existe.". Já confirmei e está tudo correcto, até porque eu utilizo isto para preencher comboboxs (sem ser DataGrid).

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Se não existe é porque não existe mesmo...

Verifica lá os campos que a tabela te devolve.

Tu aqui só estás a devolver um campo...

 Dim query As  String = "SELECT IDEstadoCivil FROM TClientes WHERE IDClientes = 1"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Sim, eu sei que só estou a devolver um campo. Mas existe esse IDCliente.

Agora não tenho possibilidade, mas assim que possa verifico novamente todos os dados. Eu pus = 1, porque foi para testar. Porque na verdade, será antes:

Dim query As String = "SELECT IDEstadoCivil FROM TClientes"

Creio que será assim, pois os dados terão de ser mostrados consoantes os clientes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Não estamos em sintonia...

Deixa ver se nos conseguimos entender.

Tens uma tabela, vamos chamar Principal, depois tens a outra tabela chamada de Secundária, na tabela principal tens um campo com o nome IDdaTabelaSecundaria, e a tabela Secundaria, terá os seguintes campos, IDTabela, Descricao. A relação é entre o IDdaTabelaSecundaria e IDTabela.

A lógica do processo, tu preenches um DataGridView com os dados todos da tabela principal (por agora deixas estar a coluna IDdaTabelaSecundaria só para veres isto a funcionar), e preenches uma tabela em memória com todos os dados da tabela secundária (ou pelo menos todos os possiveis). Após isto só tens de adicionar uma nova coluna por exemplo a combobox column, e defines a datapropertyname, ou seja o campo da tabela principal que é IDdaTabelaSecundaria, as restantes propriedades dizem respeito à segunda tabela. O valuememeber, que é o campo que faz a "ponte"/relação entre as tabelas que é o IDTabela, o displayMember, que é o que queres que apareça a Descrição, e a mais importante o DataSource que é a tabela.

No teu caso só estás a devolver o IDEstadoCivil que será o ValueMember, podes definir o DisplayMember também como o IDEstadoCivil e verás os números na Combo. Mas acho que não é isso que tu queres, por isso tens de seleccionar o IDEstadoCivil e o outro campo que seja o que tu queres que o utilizar veja, que pelo que parece será o EstadoCivil...

Sendo assim será isto:

Dim query As String =  "SELECT IDEstadoCivil,EstadoCivil FROM TClientes"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Tu anteriormente tinhas-me dito uma coisa diferente em relação ao DataPropertyName, do que disseste agora. Provavelmente era isso que estava a fazer conflito. O DataPropertyName tem de conter o campo que liga as tabelas, correcto?  Ou seja, IDEstadoCivil.

A query que me deste agora também está mal, deverá ser feita assim:

Dim query As String = "SELECT * FROM TEstadoCivil"

Em vez de:

Dim query As String =  "SELECT IDEstadoCivil,EstadoCivil FROM TClientes"

Pois não existe "EstadoCivil" na tabela principal TClientes, existe apenas e só IDEstadoCivil (Que liga à sua tabela secundária TEstadoCivil) e por sua vez dá erro.

Contudo com a query que eu fiz já dá tudo bem.

Estava aqui com uns problemas, pois os dados estavam a aparecer mal, ou seja em vez de aparecer Solteiro aparecia Viúvo (por exemplo) e eram aqui uns pormenores.

Já está a funcionar porreiramente, um obrigado r00t!  :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Não tinha dito... não escrevi foi tudo...  :P

O DataPropertyName, é o campo da tabela que preenche o datagrid que está relacionado com a tabela que tem os dados que deverão aparecer na combobox.

Em relação à query, eu olhei para os posts, e assumi que fosse essa...  :D

Mas só tu é que sabes como é que são as tabelas e as respectivas relações entre elas.

:P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
j.mendes24

ja conseguiste?

eu tive o mesmo problema mas consegui resolver, tens que usar os inner join do SQL.

caso ainda nao tenha resolvido diz alguma coisa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Não tinha dito... não escrevi foi tudo...  :confused:

O DataPropertyName, é o campo da tabela que preenche o datagrid que está relacionado com a tabela que tem os dados que deverão aparecer na combobox.

Em relação à query, eu olhei para os posts, e assumi que fosse essa...  :P

Mas só tu é que sabes como é que são as tabelas e as respectivas relações entre elas.

:D

O que interessa é que já está tudo bem, obrigado  :thumbsup:

ja conseguiste?

eu tive o mesmo problema mas consegui resolver, tens que usar os inner join do SQL.

caso ainda nao tenha resolvido diz alguma coisa.

Sim, resolvi desta forma.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.