none
DropDownList dentro de um controle Repeater RRS feed

  • Pergunta

  • Estou tendo problemas com o controle Repeater quando tento utilizar um dropdownlist dentro do mesmo.
    Se o dropdownlist estiver no repeater, durante o postback simplesmente perco todos os itens do repeater! Quando ele não está (fiz o teste), consigo
    recuperar todos os itens tranquilamente!

    O meu repeater recebe uma collection de um objeto como datasource no page_load e cada item dessa primeira collection irá possuir um dropdownlist
    que posteriormente ira receber também uma outra collection com valores para o usuário escolher que posteriormente precisarei recuperar (quando
    o usuário clicar no botão enviar por exemplo).

    Será que estou fazendo algo de errado ou estou esquecendo alguma coisa? Pois sem o ddl funciona, com ele perco os itens do repeater...

    Seguem exemplos do código:

    ASPX:

    <asp:Repeater ID="rptListaOpcoes" runat="server" EnableViewState="true" OnItemDataBound="rptListaOpcoes_ItemDataBound">
    	<ItemTemplate>
    		<span style="font-weight:bold">
    			*&nbsp;Op&ccedil;&atilde;o:&nbsp<%#DataBinder.Eval(Container.DataItem, "Opcao")%>
    		</span>
    		<div style = "text-align:left">
                            Faculdade: <%#DataBinder.Eval(Container.DataItem, "Faculdade")%> <br />
                            Hor&aacute;rio: 
    				<asp:Label ID="lblHorario" runat="server" Visible="false" Text=<%#DataBinder.Eval(Container.DataItem, "HorarioDescricao")%>></asp:Label>
    				<asp:DropDownList ID="ddlEscolheHorario" runat="server" Font-Size="X-Small" Visible="false"></asp:DropDownList><br />
    			Ano/Semestre: <%#DataBinder.Eval(Container.DataItem, "Ano")%>/<%#DataBinder.Eval(Container.DataItem, "Semestre")%> <br />
    			Disciplina: <asp:Label ID="lblDisciplina" runat="server" Text=<%#DataBinder.Eval(Container.DataItem, "Disciplina")%>></asp:Label> <br />
    			Turma: <%#DataBinder.Eval(Container.DataItem, "Turma")%> <br />
    			<br />
    		</div>
    	</ItemTemplate>
    </asp:Repeater>

    CodeBehind (C#): (Tentei adicionar os itens do DDL tanto via datasource/databind como via o exemplo abaixo e nenhum deu resultado..)

    protected void rptListaOpcoes_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
    	RepeaterItem item = e.Item;
    	if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
    	{
    		DropDownList ddl = (DropDownList)item.FindControl("ddlEscolheHorario");
                    Label lblHor = (Label)item.FindControl("lblHorario");
                    Label lblDiscip = (Label)item.FindControl("lblDisciplina");
    
                    if (ddl != null && lblDiscip != null)
                    {
                        Collection<OpcoesOfertaAgrupadoHorario> ooah = gi.ObterHorariosOpcoesDeOfertaDeCursoAgrupadas(
                            _MatriculaDTO.IDOfertaCurso.Value, lblDiscip.Text);
    
                        foreach (OpcoesOfertaAgrupadoHorario atual in ooah)
                        {
                            ddl.Items.Add(new ListItem { Text = atual.HorarioDescricao, Value = atual.ID.ToString() });
                        }
                    }
                    
                    if (ddl != null && ddl.Items.Count > 1)
                        ddl.Visible = true;
                    else if (lblHor != null)
    		    lblHor.Visible = true;
    	}
    }
    
    private void FinalizaOpcoes()
    {
    	foreach (RepeaterItem item in rptListaOpcoes.Items)
    	{
                        if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
                        {
                            DropDownList ddl = (DropDownList)item.FindControl("ddlEscolheHorario");
                            if (ddl != null && ddl.Visible == true &&
                                ddl.SelectedValue != null && ddl.SelectedValue != String.Empty)
    			IDOpcoesOferta.Add(Convert.ToDecimal(ddl.SelectedValue));
    		}
    	}
    }

    sexta-feira, 13 de novembro de 2009 20:29

Todas as Respostas

  • Fale,

    Dessa forma você evita que seja criado novamente ou populado o cotrole.

     

    if (!IsPostBack)
    {
        //Colocar a lógica
    }

    Abraço!


    Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!
    sexta-feira, 13 de novembro de 2009 20:48
  • Obrigado pela resposta.

    Porém a definição do datasource e o databind já estão sendo feitos exatamente como você indicou, portanto
    o problema não é esse.

    Abraços.
    sábado, 14 de novembro de 2009 18:56
  • Oi,

    Não consegui entender o que tentou fazer com o itemdatabound.

    Se entendi bem, é mais do que simplesmente ter uma dropdown dentro do repeater, o problema é que os valores da dropdown se alteram conforme os campos horário e disciplina, certo ? Então cada linha do repeater pode possuir um conjunto de opções diferentes.

    Primeiro você precisa ter certeza que o método "ObterHorariosOpcoesDeOfertaDeCursoAgrupadas" devolve valores toda vez que está sendo executado. Será que você tem dados adequados na base de dados para fazer essa simulação ? Quando você disse que ao tirar a dropdown do repeater ela funcionou, isso é muito simplista, porque tirando a dropdown do repeater você está ou criando valores fixos ou fazendo uma única chamada deste método, quando no repeater ele será chamado várias vezes com parâmetros diferentes. A questão é : Existem dados sendo retornados ?

    De resto, o código parece não ter problemas. Execute o código passo-a-passo e forneça mais detalhes sobre o que ocorre no itemDatabound do repeater.

    []'s
    Dennes
    http://twitter.com/Dennes

    * Treinamento de ASP.NET 3.5 no RJ dia 23/11 - Apenas 12x R$ 66,15 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp

    * Treinamento C# e Framework .NET c/OO dia  05/12 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    segunda-feira, 16 de novembro de 2009 22:31
  • Exatamente Dennes.. Os valores da dropdown de cada item do repeater são diferentes.

    No caso eu busco os horários para cada disciplina (que repesenta um item no repeater) e apresento na tela ou um label com o horário
    (caso só exista um único horário) ou um dropdownlist (caso existam pelo menos 2 horários distintos) para o usuário escolher.

    Já percorri o código em debug, o método retorna valores sim. Está tudo funcionando corretamente.

    O problema é no postback, depois que o usuário visualizou os dados e clicou em "enviar" por exemplo.

    Fiz mais alguns testes e o repeater aparentemente "SE PERDE" com qualquer controle de input dentro dele (textbox, dropdownlist, até um select do html com runat server). Se eu não possuir nenhum controle desse tipo, por exemplo apenas labels dentro do repeater ele funciona certinho,
    consigo recuperar seus items no postback tranquilamente. Caso eu adicione algum controle de input dos citados acima o repeater volta no postback completamente vazio, sem nenhum item !!
    terça-feira, 17 de novembro de 2009 10:09