Ir para conteúdo
Fórum Script Brasil
  • 0

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


Lucas Conceição

Pergunta

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 para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

Xistyle não ta funcionando,

Está retornando erro do banco, falando que contem mais de 1 linha (óbvio) USHAHUShuA

porém não sei o que fazer agora =///

Esse erro acontece bem quando o Adapter vai encher o dataset --> mAdapter.Fill(mDataSet);

Editado por Lucas Conceição
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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;
                    }

Editado por Lucas Conceição
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...