Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
bioshock

Combobox DataGrid {Resolvido}

Recommended Posts

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!  :)

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.