none
Problema: Page_Load x DataBind RRS feed

  • Pergunta

  • Pessoal, tenho a seguinte sequencia:

    1 - seleciono o DropDownList da categoria Artistas;
    2 - preencho o DropDownList de álbuns do artista;
    3 - seleciono um álbum;
    4 - preencho uma GridView com as músicas desse álbum;

    Até aqui, consegui fazer.
    O problema é que no click do hyperlink da musica eu não consigo manter os drops na posição.
    Alguma sugestão? Vi alguns nomes por ai como iList e ListView mas não sei usá-los...
    Meu page load está assim até agora:

        protected void Page_Load(object sender, EventArgs e)
        {
            string codMus = Request.QueryString["letra"];
    
            try
            {
                if (!Page.IsPostBack)
                {
                    if (codMus == null)
                    {
                        //carrega os artitas
                        DdlArtista.DataSource = new Pesquisas.Pesquisa().RetPesq("Artistas", "Arts");
                        DdlArtista.DataTextField = "Nome";
                        DdlArtista.DataValueField = "CodArt";
                        DdlArtista.DataBind();
                    }
                    else
                    {
                        //busca os códigos de artista e álbum para manter a posição
                        OleDbDataReader Codigos = new Manutencao.Cadastro().RetornaCodigos(codMus);
    
                        //carrega os artitas se tiver codigo na query string
                        DdlArtista.DataSource = new Pesquisas.Pesquisa().RetPesq("Artistas", "Arts");
                        DdlArtista.DataTextField = "Nome";
                        DdlArtista.DataValueField = "CodArt";
                        DdlArtista.DataBind();
                        DdlArtista.SelectedItem.Value = Codigos["CodArt"].ToString();
    
                        //carrega com base no artista
                        DdlAlbum.DataSource = new Manutencao.Cadastro().DdlAlbunsArtista(DdlArtista.SelectedItem.Value);
                        DdlAlbum.DataTextField = "Album";
                        DdlAlbum.DataValueField = "CodAlb";
                        DdlAlbum.DataBind();
                        DdlAlbum.SelectedItem.Value = Codigos["CodAlb"].ToString();
    
                        //carrega campos para alteração
                        Pesquisas.MostraLetra drLetra = new Pesquisas.MostraLetra(codMus);
                        TxtClipe.Text = drLetra.clipe;
                        TxtCodigo.Text = drLetra.codMus;
                        TxtLetra.Text = drLetra.letra;
                        TxtTitulo.Text = drLetra.titulo;
                    }
                }
            }
            catch (Exception ex)
            {
                LblMsg.Text = ex.Message;
            }
        }

    :: Jeferson Ferreira :: www.jefersonfs.com.br
    sexta-feira, 21 de agosto de 2009 19:14

Respostas

  • Jeferson

    Seguinte, sua página nunca vai entrar no trecho de código onde vc carrega o artista, album e os textbox's. Isto porque voce testa se não é postback, se não for vc executa. Se codMus não for null, executa o código que seria responsável por posicionar  os items se não for eecuta a carga novamente. Acontece que depois de carregar a página pela primeira vez, voce não entra mais neste trecho de código. É por isso que no clique do seu hyperlink ele não mantem os estados. Se bem que deve ter mais alguma coisa ai, pois aqui quando programo meus dropdown's, sempre eles continuam mostrando o ultimo item selecionado, mesmo durante os postbacks..


    Espero ter ajudado
    []'s
    Sanses


    --> se a resposta foi util, marque-a como util.
    sábado, 22 de agosto de 2009 02:29
  • Olá,
    tente setar o validaterequest como false na diretiva @Page
    []s

    <%

    @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" ValidateRequest="false" %>


    Marcelo Ramos
    domingo, 23 de agosto de 2009 17:00

Todas as Respostas

  • Jeferson

    Vamos por partes, o viewstate dos seus dropdown's estão ativados?
    Pergunto isso porque por padrão o item selecionado seria guardado no viewstate do compoente.
    Verifique se não é este o problema antes de prosseguirmos...


    Espero ter ajudado
    []'s
    Sanses


    --> se a resposta foi util, marque-a como util.

    sábado, 22 de agosto de 2009 00:19
  • Sim, os dois estão true.
    :: Jeferson Ferreira :: www.jefersonfs.com.br
    sábado, 22 de agosto de 2009 02:09
  • Jeferson

    Seguinte, sua página nunca vai entrar no trecho de código onde vc carrega o artista, album e os textbox's. Isto porque voce testa se não é postback, se não for vc executa. Se codMus não for null, executa o código que seria responsável por posicionar  os items se não for eecuta a carga novamente. Acontece que depois de carregar a página pela primeira vez, voce não entra mais neste trecho de código. É por isso que no clique do seu hyperlink ele não mantem os estados. Se bem que deve ter mais alguma coisa ai, pois aqui quando programo meus dropdown's, sempre eles continuam mostrando o ultimo item selecionado, mesmo durante os postbacks..


    Espero ter ajudado
    []'s
    Sanses


    --> se a resposta foi util, marque-a como util.
    sábado, 22 de agosto de 2009 02:29
  • Sanses, eu sou principiante em asp.net c#, mas se eu não for muito burro, acredito que o problema seja o clique na grid, pois ele chama a página novamente, aí nesse ponto acho que ele começa todo o processo de carregamento dos drops, perdendo a viewstate.

    Digo isto porque até clicar na grid tudo funciona, aí como no link da grid tenho "ManLetras.aspx?letra={0}", ou seja, chamo a página novamente, só que desta vez passando o código da música, acho que este processo mata os viewstate.

    E daí, como não manjo nada ainda, não sei como fazer daqui pra frente... :(
    :: Jeferson Ferreira :: www.jefersonfs.com.br
    domingo, 23 de agosto de 2009 15:29
  • Jeferson

    Posta o código DHTML da sua página e os metodos envolvidos no processo de carregamento para poder analizar melhor.


    Sanses
    domingo, 23 de agosto de 2009 16:06
  • Olá,

    não sei se o ambiente permite alteração, mas pelo que entendi você chama a mesma página de novo certo ?
    Precisa realmente ser assim ? Se você trocar o HyperLink por um LinkButton, ou um Button, pode fazer esse filtro no evento Click deles, não precisando passar por QueryString como fez com "letra={0}" e não perdendo o item selecionado no DropDownList

    []s
    http://www.marceloramos.net/Blog

    Marcelo Ramos
    domingo, 23 de agosto de 2009 16:12
  • Pessoal, troquei a grid pelo ListBox e resolvi o problema. Mas agora tenho outro: ao alternar os álbuns dá o seguinte erro:

    System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (ctl00$ContentPlaceHolder1$TxtLetra="...e is alive<br>
    Love is alive,...").


    Como resolver?

    :: Jeferson Ferreira :: www.jefersonfs.com.br
    domingo, 23 de agosto de 2009 16:51
  • Olá,
    tente setar o validaterequest como false na diretiva @Page
    []s

    <%

    @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" ValidateRequest="false" %>


    Marcelo Ramos
    domingo, 23 de agosto de 2009 17:00
  • Eu vi essa opção, mas lá na mensagem diz que n~so é recomendado. Posso por mesmo assim?
    :: Jeferson Ferreira :: www.jefersonfs.com.br
    domingo, 23 de agosto de 2009 17:54
  • ha perigos sim, veja no link abaixo
    http://www.asp.net/learn/whitepapers/request-validation/


    Marcelo Ramos
    domingo, 23 de agosto de 2009 18:17
  • Certo, obrigado pela dica.
    O site que estou fazendo é este da assinatura. Estou fazendo ele para conhecer a linguagem.

    Bom, vou fechar o tópico porque já estou fugindo do assunto principal.

    Obrigado pela ajuda de todos!
    :: Jeferson Ferreira :: www.jefersonfs.com.br
    domingo, 23 de agosto de 2009 18:36