ASP.NET - Adicionar manipulador de eventos para LinkButton dentro de repetidor em uma chamada RenderContent

StackOverflow https://stackoverflow.com/questions/122821

Pergunta

Eu tenho um Sharepoint WebPart que carrega um costume de Controle do Usuário. O controlo de utilizador contém um repetidor que por sua vez contém vários LinkButtons.

Na chamada RenderContent na Webpart Eu tenho algum código para adicionar manipuladores de eventos:

        ArrayList nextPages = new ArrayList();
        //populate nextPages ....
        AfterPageRepeater.DataSource = nextPages;
        AfterPageRepeater.DataBind();

        foreach (Control oRepeaterControl in AfterPageRepeater.Controls)
        {
            if (oRepeaterControl is RepeaterItem)
            {
                if (oRepeaterControl.HasControls())
                {
                    foreach (Control oControl in oRepeaterControl.Controls)
                    {
                        if (oControl is LinkButton)
                        {
                            ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click);
                        }
                    }
                }
            }
        }

O PageNavigateButton_Click função nunca é chamado no entanto. Eu posso ver isso sendo adicionado como um manipulador de eventos no depurador no entanto.

Todas as idéias? Estou perplexo como fazer isso.

Foi útil?

Solução

Pela RenderContent time () é chamado, todos os manipuladores de eventos registrados foram chamados pela estrutura. Você precisa adicionar os manipuladores de eventos em um método anterior, como OnLoad ():

protected override void OnLoad(EventArge e)
 { base.OnLoad(e);
   EnsureChildControls();

   var linkButtons = from c in AfterPageRepeater.Controls
                                                .OfType<RepeaterItem>()
                     where c.HasControls()
                     select c into ris
                        from lb in ris.OfType<LinkButton>()
                        select lb;

   foreach(var linkButton in linkButtons)
    { linkButton.Click += PageNavigateButton_Click
    }                          
 }

Outras dicas

Você tentou atribuir as propriedades CommandName e CommandArgument a cada botão como você iterate através? O controle Repeater apóia o evento ItemCommand, que é um evento que será gerado quando um controle com a propriedade CommandName é hit.

De lá, ele é bastante fácil de processo, porque os valores CommandName e CommandArgument são passados ??para o evento e são facilmente acessíveis.

Você precisa ter certeza de que o botão de ligação é re-adicionado à árvore de controle e / ou que o evento é religado até o controle antes de o evento é acionado.

artigo @ 4guysfromrolla

Eu nunca fiz um SharePoint WebPart, então eu não sei se isso vai aplicar. Mas se fosse uma página apsx planície de idade, eu diria que no momento em que é renderização, que seja tarde demais. Tente adicionar os manipuladores de eventos em eventos Init ou PreInit do controle.


Editar: Espere, eu acho Dilli-O pode estar certo. Veja o Adicionar controles de botão para uma seção Repeater no final de http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html . É em VB.NET, mas você pode facilmente fazer a mesma coisa em C #.

Como outros apontaram, você está adicionando o manipulador de eventos muito tarde no ciclo de vida da página. Para SharePoint WebParts você normalmente quer substituir a classe onInit / CreateChildControls métodos para lidar com a atividade.

Você precisa do seu webpart para implementar o INamingContainer interface de marcador, é usado pela estrutura para permitir postagens para voltar ao controle correto ... Também os controles em seu webpart tudo precisa ter um ID.

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