Pergunta

Estou tendo problemas retreiving os valores fora de um dropdownlist criado dinamicamente. todos os controles são criados na seção Page_Init. os listitems são adicionados nessa altura também a partir de uma matriz de listitems. (Os controles são nomeadas da mesma assim deve ser acessível para o viewstate para configuração apropriada.)

aqui é a função que as tentativas para recuperar os valores:

protected void Eng98AssignmentComplete_Click(object sender, EventArgs e)
{
    String myID = "0";
    Page page = Page;
    Control postbackControlInstance = null;
    // handle the Button control postbacks
    for (int i = 0; i < page.Request.Form.Keys.Count; i++)
    {
        postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
        //Response.Write(page.Request.Form.Keys[i].ToString());
        if (postbackControlInstance is System.Web.UI.WebControls.Button)
        {
            myID = Convert.ToString(
                postbackControlInstance.ID.Replace("button_", ""));
        }
    }
    String txtholder = "ctl00$ContentPlaceHolder$Eng098Instructors_" + myID;
    Response.Write("MYID: " + myID + "<br/>");
    DropDownList ddInstructorCheck = (DropDownList)Page.FindControl(txtholder);
    Response.Write("Instructor Selected: "
      + ddInstructorCheck.SelectedValue + "<br/>");
}

aqui é a saída que eu vejo, não importa o que o instrutor foi selecionado .....

MYID: 1_1
Instructor Selected: 0
ctl00$ContentPlaceHolder$Eng098Instructors_1_1

o nome do controle é correta (verificado através de ver fonte) ....

idéias?

Foi útil?

Solução 8

Eu tive 2 capturas .... aqui está o que eles eram.

1.  I didn't clear the table I was adding to before re-creating the controls.

aparentemente minha atenção aos detalhes foi off ontem, eu tenho certeza que o favorito ctlXX do controle era algum número diferente sobre postback devido à forma como eu estava recriando os controles.

2.  I was assigning the same list to all the dropdownlist controls.  

Uma vez eu chamei a pesquisa sobre cada criação um controle dropdownlist, tudo funciona bem.

de qualquer maneira para o que vale a pena ....

Outras dicas

Você vai um monte de trabalho para construir esta seqüência de fantasia:

ctl00 $ ContentPlaceHolder $ Eng098Instructors_1_1

Essa é a ID cliente de seu controle, e não o ID de servidor. Este código está sendo executado no lado do servidor, e então você precisa a identificação do servidor. Para obter esse controle usando o ID de servidor, você precisa fazer isso:

ContentPlaceHolder.FindControl("Eng08Instructors_1_1");

Aviso eu não olhar na página, porque o seu titular lugar conteúdo criado um novo contêiner de nomeação.

Além disso, a forma como o circuito está configurado a variável myID irá sempre acabam segurando o última na coleção Keys. Por que sequer se preocupar com o loop?


Com base em seus comentários, a melhor maneira de encontrar o id do dropdownlist é assim:

string id = ((Control)sender).ID.Replace("button_", "Eng098Instructors_");

porque não basta salvar o controle em uma instância em sua classe para que você não tem que usar FindControl?

Você também recriar os controles durante a postagem? Geradas dinamicamente / controles adicionados deve ser re-criado com todos os pedidos, eles não são automaticamente re-criado.

Por que você não lançar o remetente? Este deve ser o botão que causou a postagem:

string myId = "0";
Button btn = sender as Button;
if (btn != null)
    myId = btn.ID
...

Você precisa executar algo como isto porque a propriedade UniqueID é a chave em Request.Form.

        List<Button> buttons = new List<Button>();
        List<DropDownList> dropdowns = new List<DropDownList>();
        foreach (Control c in Controls)
        {
            Button b = (c as Button);
            if (b != null)
            {
                buttons.Add(b);
            }

            DropDownList d = (c as DropDownList);
            if (d != null)
            {
                dropdowns.Add(d);
            }
        }

        foreach (String key in Request.Form.Keys)
        {
            foreach (Button b in buttons)
            {
                if (b.UniqueID == key)
                {
                    String id = b.ID.Replace("button_", "");
                    String unique_id = "ctl00$ContentPlaceHolder$Eng098Instructors_" + id;
                    Response.Write("MYID: " + id + "<br/>");

                    foreach (DropDownList d in dropdowns)
                    {
                        if (d.UniqueID == unique_id)
                        {
                            Response.Write("Instructor Selected: " + d.SelectedValue + "<br/>");
                            break;
                        }
                    } 
                }
            }   
        }

Eu não sei por que você está gerando o controle em código (você ainda pode adicionar itens dinamicamente se você faz), mas o código que gera os controles provavelmente seria uma grande ajuda aqui. Eu estou supondo que você não está definindo o valor de item da lista e, em vez apenas definir o texto item da lista. Tente ver o que você começa a partir do campo SelectedText e postar sua função de criação de controle.

EDIT: Em resposta ao seu comentário sobre @ post de Martin, você disse "sim, eu recriar os controles na função Page_Init cada vez que a página é criada (inicial ou postagem)". Você também está definindo o valor selecionado quando você criá-los?

Você também pode usar os controles na página, mesmo se os seus dados vem de um banco de dados, os controles próprios não têm de ser gerado dinamicamente.

Como sobre isso?

((Button)sender).Parent.FindControl(myid)

Edit: eu não entendi sua pergunta. Mas eu acho que você deve seguir o ciclo de vida página. é problema comum para controles criados dinamicamente.

Eu fiz alguma pesquisa e aqui está algumas informações sobre criados dinamicamente controles ajuda pode você ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top