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

skcratch

[Ajuda] - Adicionar LinkButton de forma dinâmica a GridView

13 mensagens neste tópico

Viva!

Aquilo que pretendo fazer, é adicionar um controlo do tipo LinkButton a uma GridView de forma dinâmica, ou seja, em runtime. Até ao momento, tenho o seguinte código:

    protected void gvwSugestoes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // tornar as coluna ROW_NUM e CodSugestoesTipos invisíveis
        e.Row.Cells[0].Visible = false;
        e.Row.Cells[6].Visible = false;

        if (ddlTiposSugestao.SelectedIndex != 0)
        {
            // tornar o tipo de sugestão invisível
            e.Row.Cells[4].Visible = false;
        }

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (e.Row.Cells[7].Text.Equals(" ") || e.Row.Cells[7].Text.Equals("0"))
            {
                e.Row.Cells[7].Text = "n.a.";
            }
            else
            { 
                // adicionar o LinkButton à GridView 
            }
        }
    }

Neste caso, apenas tenho que verificar uma condição: caso a coluna com índice número 7 da Datasource (DataTable preenchida de forma dinâmica através de um TableAdapter mediante as opções escolhidas pelo utilizador), seja diferente de null, tem que adicionar um LinkButton à GridView. Já agora, alguém me sabe dizer porque motivo o valor null da base de dados está a ser "mapeado" no valor " "?

Grato desde já pela ajuda,

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O valor null da base de dados passa a   pq é um espaço em branco no html.

Isto faz com q a célula não fique vazia.

Podes alterar mudando a propriedade NullDisplayText.

Para acrescentares o linkButton fazes:

e.Row.Cells[nrCelula].Controls.Add(meuLinkButton);

em que meuLinkButton é um link button com o q precisas q podes criar na linha anterior.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

O valor null da base de dados passa a   pq é um espaço em branco no html.

Isto faz com q a célula não fique vazia.

Podes alterar mudando a propriedade NullDisplayText.

Posso continuar a usar a comparação que tenho definida? Apenas gostava de "forçar" a comparação apenas com o valor null da base de dados, para realizar uma única comparação, já que as células da coluna nunca vão estar vazias: ou vão apresentar a label n.a. ou então o LinkButton que pretendo adicionar. Neste momento, já consigo, em parte, fazer aquilo que pretendo; o código que tenho é o seguinte:

protected void gvwSugestoes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // tornar as coluna ROW_NUM e CodSugestoesTipos invisíveis
        e.Row.Cells[0].Visible = false;
        e.Row.Cells[6].Visible = false;

        if (ddlTiposSugestao.SelectedIndex != 0)
        {
            // tornar o tipo de sugestão invisível
            e.Row.Cells[4].Visible = false;
        }

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // verificar se a sugestão tem algum pdf associado
            if (e.Row.Cells[7].Text.Equals(" ") || e.Row.Cells[7].Text.Equals("0"))
            {
                e.Row.Cells[7].Text = "n.a.";
            }
            else
            { 
                // adicionar o LinkButton à GridView
                LinkButton lbnPDF = new LinkButton();
                lbnPDF.Text = "pdf";
                e.Row.Cells[7].Controls.Add(lbnPDF);
            }
        }
    }

No entanto, depois de clicar LinkButton, ou aparece a label n.a. ou então o valor armazenado na base de dados. Tem a ver com o facto de ainda não ter definido um event handler para o click ou com algum evento do ciclo de vida página (PostBack, por exemplo)?

Grato desde já pela ajuda,

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A comparação q estás a fazer podes manter, funciona à mesma.

O linkbutton precisa de ter o evento para fazer alguma coisa sim.

Não tenho a certeza se podes adicionar o evento no rowdatabound da tabela, talvez tenhas q o fazer no init ou no page_load, é uma questão de testares.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Código até ao momento:

protected void gvwSugestoes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // tornar as coluna ROW_NUM e CodSugestoesTipos invisíveis
        e.Row.Cells[0].Visible = false;
        e.Row.Cells[6].Visible = false;

        if (ddlTiposSugestao.SelectedIndex != 0)
        {
            // tornar o tipo de sugestão invisível
            e.Row.Cells[4].Visible = false;
        }

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // verificar se a sugestão tem algum pdf associado
            if (e.Row.Cells[7].Text.Equals(" ") || e.Row.Cells[7].Text.Equals("0"))
            {
                e.Row.Cells[7].Text = "n.a.";
            }
            else
            { 
                // adicionar o LinkButton à GridView
                LinkButton lbnPDF = new LinkButton();
                lbnPDF.Visible = true;
                lbnPDF.Text = "pdf";
                lbnPDF.CommandName = "streamPDF";
                lbnPDF.Command += new CommandEventHandler(lbnPDF_Click); 
                e.Row.Cells[7].Controls.Add(lbnPDF);
            }
        }
    }

    protected void lbnPDF_Click(object sender, CommandEventArgs e)
    {
        if (e.CommandName.Equals("streamPDF"))
        { 
        
        }
    }

Apesar de o LinkButton ser apresentado nas células correctas da GridView, acontecem duas coisas não desejadas: como o bruno1234 muito bem suspeitava, o event handler não está a ser correctamente registado (pelo menos no evento RowDataBound), já que quando clico no LinkButton, o código do event handler nunca chega a ser executado. Por outro lado, depois clicar, os LinkButtons desaparecem. Creio que tem a ver com o PostBack que é gerado mas não sei resolver a situação.

Alguém pode dar uma ajuda?

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A maneira mais simples é deixares o markup ter esse trabalho por ti.

Mestes na coluna onde queres o link um item template com uma label e com um linkbutton.

Depois no teu row databound, onde tens o if e o else metes um visivel e outro não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Antes demais, quero agradecer a ajuda do bruno1234 (não só agora, mas sempre que precisei!). Por acaso, já tinha pensado numa situação semelhante mas gostava de implementar uma solução mais geral; na aplicação que estou a desenvolver, existem GridViews cuja DataSource vai ter um número variável de colunas, daí tentar implementar soluções que possam ser reutilizadas (nem que seja parcialmente) nessas situações.

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso aconselho-te a criares toda a gridview dinamicamente.

O markup poupa bastante trabalho e código, mas se queres criar tudo dinamicamente é melhor n o usares.

Dinamicamente podes criar á mm td o q fazes no markup, criar boundfields, etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Quanto à questão de clicar no LinkButton e este desaparecer: alguém tem ideia do motivo pelo qual isto acontece?

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele desaparece pq entre postbacks n há um novo rowdatabound para o voltar a meter lá.

Podes sempre forçar um novo databind.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Ou então, pelo que estive a ler, realizar a operação anterior no evento RowCreated da GridView. Amanhã vou experimentar esta solução e depois logo digo alguma coisa.

Cumps!

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Tentei adicionar o LinkButton no evento RowCreated mas continuei com os mesmos problemas, pelo que decidi adicioná-lo no markup. Neste caso, o problema pode ser resolvido assim mas vão existir situações nas quais os controlos terão que ser adicionados dinamicamente, bem como o registo dos event handlers respectivos. Alguém tem mais alguma sugestão?

Grato desde já pela ajuda,

Cumps!

:confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto a meu ver não está correcto

lbnPDF.Command += new CommandEventHandler(lbnPDF_Click);

O que devias ter era isto assim

lbnPDF.Click += new EventHandler(lbnPDF_Click);

Quanto aos teus linkbuttons desparecerem, experimenta definir o ID quando o estás a criar.

lbnPDF.ID = "xpto";

0

Partilhar esta mensagem


Link 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