Jump to content
Fórum Script Brasil
  • 0

Transformando Célula do GRID(com valores do banco) em ComboBoxCell


Lucas Conceição

Question

Bom dia pessoal,

Estou com uma grande dúvida,

pesquisei por 2 dias aqui sem parar no google, no fórum msdn, nos diversoso fóruns,

porém não encontrei nada que realmente me ajudasse,

acho que está faltando uma pequena lógica só, mas não estou conseguindo perceber aonde.

O que eu pretendo é carregar os dados de uma base de dados(MySql) e quando os resultados aparecerem eu quero tranformar 2 colunas dessa grid em combobox,

Eu já consegui transofrmá-las em ComboboxCell, dai adcionei os 3 valores, porém quando carrega a grid vem sem nenhum valor na Combo, já consegui também converter o resultado da cell para comboboxcell,

Mas ainda não encontrei como pegar os dados do banco (no caso a tabela prioridade), e carregar o grid criando a combobox com 3 items (alta, media e baixa) e que já carregue o valor que vem do banco dea dados.

Espero que tenha dado para entender.

OBS. Estou desenvolvendo em C#

Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0

Lucas, não entendi. Você faz uma seleção de dados e atribui a um objeto. Deste, você carrega o DataGridView. Não basta pegar o campo que quer trabalhar como ComboBox, dar um "Visible = False" e trabalhar com esses dados invisíveis para montar seu ComboBox?

Ficou confusa a explicação :/

Link to comment
Share on other sites

  • 0

Imaginei que ficaria meio confuso mesmo SHUASHUaHU

Bom vou fazer assim,

Vou mostrar o que eu tenho e como desejo que fique:

Eu tenho esse código para popular minha DataGridView até o momento:

mDataSet = new DataSet("Tarefa");
                    mConn = new MySqlConnection("Persist Security Info=False; server=localhost;database=plm;uid=root;password=Password1");
                    mConn.Open();

                    //cria um adapter utilizando a instrução SQL para aceder à tabela
                    mAdapter = new MySqlDataAdapter("SELECT Tarefa.tarefa_desc as Tarefa, Tarefa.prioridade as Prioridade, Tarefa.duracao as Duracao,"+
                                                           "Tarefa.status as Status, TAREFA.id" +
                                                    " FROM TIPO_SOFTWARE INNER JOIN Tarefa ON TIPO_SOFTWARE.id = Tarefa.id_software" +
                                                    " WHERE TIPO_SOFTWARE.id = " + id + ";", mConn);

                    mAdapter.TableMappings.Add("Table", "Tarefa");

                    mAdapter.Fill(mDataSet);

                    gv_tarefas.Visible = true;
                    gv_tarefas.DataSource = mDataSet;
                    gv_tarefas.DataMember = "Tarefa";
}

que gera essa imagem:

datagridview.jpg

Porém o que eu quero é que ali onde está escrito Prioridade fiquei com uma comboBox que contenha "Alta, Média e baixa", e que quando eu carrego do banco já apareça a informação nela:

datagridviewcombo.jpg

Espero que tenha esclarecido um pouco hahahahaha

Link to comment
Share on other sites

  • 0

Opa se esclareceu :D

Mas ai você pode fazer o seguinte. Aparentemente o campo Prioridade não é uma tabela a parte, é apenas uma string na sua tabela. Você pode fazer assim então:

1) Carregue seu DataGrid, como está fazendo

2) Defina sua coluna Prioridade como Visible = False

3) Você irá criar uma nova coluna, do tipo DataGridViewComboBoxColumn e adicionará a grid com o seguinte comando:

gv_tarefas.Columns.Add(meuComboBoxColumn);
4) Você mudará o seu SELECT:
"SELECT Tarefa.tarefa_desc as Tarefa, Tarefa.prioridade as Prioridade, Tarefa.duracao as Tarefa.status as Status, TAREFA.id " +
" (SELECT 'Alta', 'Média', 'Baixa') As Prioridade_Combo " +
" FROM TIPO_SOFTWARE INNER JOIN Tarefa ON TIPO_SOFTWARE.id = Tarefa.id_software" +
" WHERE TIPO_SOFTWARE.id = " + id + ";"

Com isso, você terá um SubSelect contendo os três tipos de prioridades. Como essa coluna ficará na última posição (depois do Status) e o campo Prioridade_Combo estará na última posição também, você já receberá esses valores na coluna ComboBox.

Aí basta comparar qual é o valor da coluna invisível Prioridade com os itens do ComboBox para, quando carregar a grid, mostrar ao usuário o item correto :)

PS: esse link contém um bom material com comandos que possam lhe ajudar a criar a coluna: http://msdn.microsoft.com/en-us/library/sy...oboxcolumn.aspx

Edited by Xistyle
Link to comment
Share on other sites

  • 0

É, vai retornar mais mesmo no subselect. Achei que tendo um ComboBoxColumn ele iria tratar.

Bom vai ter que alimentá-lo manualmente. Continue com o seu SELECT inicial, crie a coluna e depois alimente-a com o método .Items.AddRange("Alta", "Média", "Baixa");

Ai faça a comparação do que está na coluna invisível com o item do combo para exibição.

Poste o erro também que está ocorrendo do Fill.

Link to comment
Share on other sites

  • 0

Xistyle, consegui aqui criar o combo, porém não estou conseguindo agora pegar o valor da célula que está invisível e jogar no combo,

tentei usando assim: dr.Cells[7].DataGridView[7, cont].Value = "Baixa";

Porém da erro, um erro doido aqui sei lá,

estou debugando mas ainda não entendo porque está acontecendo.

Não estou conseguin do por exemplo chamar o que tem na combobox pelo index.

Link to comment
Share on other sites

  • 0

EDIT_2. Na verdade agora fodeo,

eu to tentando remover essas 2 colunas que cria quando faz a consulta, porém eu não consigo deletá-las,

Putz cara ta tudo muito doido aqui viu.

----------------------------------------------------

EDIT. COnsegui resolver aqui Xistyle =D

o código ficou assim: dr.Cells[7].DataGridView[7, cont].Value = colType.Items[1];

o código acima é somente pro média, ai troco o valor conforme necessário.

----------------------------------------------

Então Xistyle,

Vou te mostrar como estava:

o Código abaixo é somente para popular a gridview e criar o combobox

Esqueci de cometnar que eu tenho 2 colunas adicionadas já, uma linkcolumn e uma checkboxcolum

mDataSet = new DataSet("Tarefa");
                    mConn = new MySqlConnection("Persist Security Info=False; server=localhost;database=plm;uid=root;password=Password1");
                    mConn.Open();

                    //cria um adapter utilizando a instrução SQL para aceder à tabela
                    mAdapter = new MySqlDataAdapter("SELECT Tarefa.tarefa_desc as Tarefa, Tarefa.prioridade as Prioridade, Tarefa.duracao as Duracao," +
                                                           "Tarefa.status as Status, TAREFA.id" +
                                                    " FROM TIPO_SOFTWARE INNER JOIN Tarefa ON TIPO_SOFTWARE.id = Tarefa.id_software" +
                                                    " WHERE TIPO_SOFTWARE.id = " + id + ";", mConn);

                    mAdapter.TableMappings.Add("Table", "Tarefa");
                    mAdapter.Fill(mDataSet);

                    gv_tarefas.Visible = true;
                    gv_tarefas.DataSource = mDataSet;
                    gv_tarefas.DataMember = "Tarefa";

                    DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();
                    colType.HeaderText = "Prioridade_Combo";
                    colType.DropDownWidth = 90;
                    colType.Width = 90;
                    colType.MaxDropDownItems = 3;
                    this.gv_tarefas.Columns.Insert(7, colType);
                    colType.Items.AddRange("Alta", "Média", "Baixa");
                    this.gv_tarefas.Columns[3].Visible = false;
Agora vem o código de verificação de prioridade e status, vou comentar pra você entender melhor: No exemplo a baixo eu estou tentando alterar o valor da combobox que eu sei que está errado, porque eu tenho que selecionar pelo Index, mas não consegui fazer isso ainda;
//Laço para percorrer todas as linhas do DataGridView
                foreach (DataGridViewRow dr in gv_tarefas.Rows)
                {
                    //Condição para coluna prioridade, se for = 0 a prioridade é baixa
                    if (dr.Cells[3].Value.ToString() == "0")
                    {
                        //Condição para coluna 5, se for = 0 o status é fechado
                        if (dr.Cells[5].Value.ToString() == "0")
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Baixa";
                            dr.Cells[3].DataGridView[3, cont].Value = "Baixa"; //Linha da Combobox
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Green;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.White;
                            dr.Cells[5].DataGridView[5, cont].Value = "Fechado";
                        }
                        //Condição para coluna 5, se for = 1 o status é aberto
                        else
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Baixa";
                            dr.Cells[7].DataGridView[7, cont].Value = "Baixa";//Linha da Combobox
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Green;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.White;
                            dr.Cells[5].DataGridView[5, cont].Value = "Aberto";
                        }

                    }
                    //Condição para coluna prioridade, se for = 1 a prioridade é Média
                    else if (dr.Cells[3].Value.ToString() == "1")
                    {
                        //Condição para coluna 5, se for = 0 o status é fechado
                        if (dr.Cells[5].Value.ToString() == "0")
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Media";
                            dr.Cells[7].DataGridView[7, cont].Value = "Media";//Linha da Combobox
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Yellow;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.Black;
                            dr.Cells[5].DataGridView[5, cont].Value = "Fechado";
                        }
                        //Condição para coluna 5, se for = 1 o status é aberto
                        else
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Media";
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Yellow;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.Black;
                            dr.Cells[5].DataGridView[5, cont].Value = "Aberto";
                        }
                    }
                    //Condição para coluna prioridade, se for = 2 a prioridade é alta
                    else if (dr.Cells[3].Value.ToString() == "2")
                    {
                        //Condição para coluna 5, se for = 0 o status é fechado
                        if (dr.Cells[5].Value.ToString() == "0")
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Alta";
                            dr.Cells[7].DataGridView[7, cont].Value = "Alta";//Linha da Combobox
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Red;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.White;
                            dr.Cells[5].DataGridView[5, cont].Value = "Fechado";
                        }
                        //Condição para coluna 5, se for = 1 o status é aberto
                        else
                        {
                            dr.Cells[3].DataGridView[3, cont].Value = "Alta";
                            dr.Cells[7].DataGridView[7, cont].Value = "Alta";//Linha da Combobox
                            gv_tarefas.Rows[cont].Cells[3].Style.BackColor = Color.Red;
                            gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = Color.White;
                            dr.Cells[5].DataGridView[5, cont].Value = "Aberto";
                        }
                    }
                    else
                    {
                        return;
                    }

Edited by Lucas Conceição
Link to comment
Share on other sites

  • 0

Bom Xistyle,

Eu acabei mudando o código que eu estava fazendo porque estava dando muitos problemas,

criei então 2 combobxcolumns manualmente,

Ai eu faço a consulta, deixo as colunas da consutla invisíveis e coloco o valor nas colunas combobox,

Porém estão acontecendo coisas (não são erros),

Em certas consultas, o combobox não abre pra mostrar os items,

Os items das combobox eu coloquei manualmente também, soment eusei código para mostrar na tela o respectivo selecionado.

Você trem algum idéia porque as combos não abrem em algumas consultas?

Link to comment
Share on other sites

  • 0

Desculpa Lucas. Fiquei sem internet ontem e não deu pra responder mais cedo.

Você criou então o CheckBoxColumn, populou ele manualmente com os 3 tipos (Alta, Média, Baixa) e depois só comparou com o que está na coluna invisível? (usando aquele .Items.Add para popular e depois comparando o texto que está na coluna invisível para atribuir qual será o índice do seu combobox).

Levando em consideração o post que colocou o código, a primeira parte tá legal.

A segunda, você poderia ter otimizado melhor o código. Segue um exemplo (só precisa ver direitinho os índices das colunas, se dá pra achar um ponto em comum):

//Laço para percorrer todas as linhas do DataGridView
                foreach (DataGridViewRow dr in gv_tarefas.Rows)
                {
                    //Condição para coluna prioridade, se for = 0 a prioridade é baixa
                    if (dr.Cells[3].Value.ToString() == "0")
                    {
            strTexto = "Baixa";
            corBack = Color.Green;
            corFore = Color.White;

                    }
                    //Condição para coluna prioridade, se for = 1 a prioridade é Média
                    else if (dr.Cells[3].Value.ToString() == "1")
                    {
            strTexto = "Média";
            corBack = Color.Yellow;
            corFore = Color.Black;
                        
                    }
                    //Condição para coluna prioridade, se for = 2 a prioridade é alta
                    else if (dr.Cells[3].Value.ToString() == "2")
                    {            
            strTexto = "Média";
            corBack = Color.Yellow;
            corFore = Color.Black;
                    }
                    else
                    {
                        return;
                    }
                    
//Status Fechado
if (dr.Cells[5].Value.ToString() == "0")
{
    dr.Cells[3].DataGridView[3, cont].Value = strTexto;
    gv_tarefas.Rows[cont].Cells[3].Style.BackColor = corBack;
    gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = corFore;
    dr.Cells[5].DataGridView[5, cont].Value = "Fechado";
}

//Status Aberto
else
{
    dr.Cells[3].DataGridView[3, cont].Value = strTexto;
    gv_tarefas.Rows[cont].Cells[3].Style.BackColor = corBack;
    gv_tarefas.Rows[cont].Cells[3].Style.ForeColor = corFore;
    dr.Cells[5].DataGridView[5, cont].Value = "Aberto";
}

Link to comment
Share on other sites

  • 0

Então Xistyle,

Ei criei manualmente os dois combosboxcolumn e coloquei os items manualmente também em cada um deles,

Fui la no meu datagridview, cliquei com o botão direito e add (ai adicionei as colunas que eu queria e coloquei seus respectivos items dentro),

Eu tenho uma treeview que tem seus níveis de consulta no banco,

no nível mais profundo eu consigo abrir o combobox de prioridade, porém nos outros níveis não consigo,

e ainda não entendi o porque,

e o combo de status só consigo abrir no último e penúltimo nível.

Segue imagens abaixo pra ver se ajuda.

Essa é minha TreeView e seus respectivos nós:

treeviewall.jpg

Ai quando eu seleciono algum dos Softwares (TeamCenter, NXCAm, NxCAD), eu consigo abrir o combobox e escolher:

treeviewteamcenter.jpg

Porém se eu vou pro nível support/desenvolvimento ou engenharia meCãnica,etc já não consigo mais, o combobox simplesmente não abre:

treeviewsupport.jpg

Alguma idéia Xistyle?

Link to comment
Share on other sites

  • 0

Toda vez que você clica em um nó da sua TreeView, sua DataGridView deverá ser recarregada. Pode existir alguma "sujeira" que não libera a visualização dos itens do ComboBox.

Tente definir como NULL o DataSource e depois atribuí-lo, carregando com os dados do nó clicado. Depois execute novamente o for each que usou para percorrer as linhas e apontar o item correspondente do ComboBox.

Se possível também implemente a adição dos itens via código. Com isso, quando recarregar a grid, poderá adicionar novamente a coluna e seus respectivos itens.

Link to comment
Share on other sites

  • 0

Xistyle,

Eu tenho um Método que se chama MostrarTarefas(),

nele está o código que é exibido na grid,

Agora fiz assim,

tirei todos os items que eu criei das combobox,

E no começo desse método criei de novo,

Prioridade.Items.Add("Alta");

Prioridade.Items.Add("Media");

Prioridade.Items.Add("Baixa");

Status.Items.Add("Fechado");

Status.Items.Add("Aberto");

Ai fui testar, e continua não abrindo, da uma raiva quando não da pra intender porque não funciona e não ad erro ¬¬

Link to comment
Share on other sites

  • 0

Ai complica cara... montei um projetinho simples com todas as configurações padrões. Fiz um SELECT e atribui o retorno dele como DataSource da minha Grid. Depois criei uma DataGridViewComboBoxColumn, adicionei os itens a ela e adicionei a coluna à Grid. Funcionou normalmente.

Poderia ter sido alguma configuração da sua grid? Dê uma verificada nas propriedades.

Link to comment
Share on other sites

  • 0

Olha Xistyle,

To achando que é alguma coisa assim porque não existe um porque,

Eu tenho somente um laço no final da minha consulta que é para não poder clicar na célula e organizar por nome ou o que for que está assim:

for (int i = 0; i < gv_tarefas.Columns.Count; i++)
            {
                gv_tarefas.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic;
            }

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...