2008-09-23 2 views
4

사용자 지정 사용자 정의 컨트롤을로드하는 Sharepoint WebPart가 있습니다. 사용자 정의 컨트롤에는 여러 개의 LinkButton이 차례로 들어있는 Repeater가 있습니다. 내가 이벤트 핸들러를 추가하는 몇 가지 코드를 가지고 한는 WebPart에서 RenderContent 통화에서 ASP.NET - RenderContent 호출에서 Repeater 내부의 LinkButton에 이벤트 처리기 추가

는 :

 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); 
         } 
        } 
       } 
      } 
     } 

함수 PageNavigateButton_Click는 그러나 호출되지 않습니다. 그러나 디버거에서 이벤트 처리기로 추가되는 것을 볼 수 있습니다.

아이디어가 있으십니까? 나는 이것을 어떻게하는지 잘 모르고있다.

+0

나는 사람들의 제안을 읽은 후 코드를 조금 뒤죽박죽로 읽었다. 지금 CreateChildControls() 함수에서 이벤트 처리기를 추가하려고하지만 여전히 해고되지 않습니다. 지금까지 도움을 주셔서 감사합니다, 그것은 바르게 평가된다 –

+1

게임에서 이것을 늦게 보는 것을 위해. CreateChildControls를 사용하지 마십시오 ... 너무 늦었습니다. 대신 모든 동적 컨트롤을 작성하려면 OnInit 핸들러를 재정의하십시오. – NotMe

답변

6

RenderContent()가 호출 될 때까지 등록 된 모든 이벤트 핸들러가 프레임 워크에 의해 호출되었습니다. 당신의 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 
    }       
} 
+0

나는 시도했다. 이제 CreateChildControls() 메서드의 이벤트 처리기를 추가하는 코드를 사용하면됩니다. 감사 –

1

이벤트가 발생하기 전에 링크가 컨트롤 트리에 다시 추가되거나 이벤트가 컨트롤에 연결되어 있는지 확인해야합니다.

Article @ 4guysfromrolla

1

나는 셰어는 WebPart 해본 적이 없다, 그래서이 적용됩니다 나도 몰라. 하지만 평범한 오래된 Apsx 페이지라면, 렌더링 할 때가 지나면 너무 늦었다 고 말할 수 있습니다. 컨트롤의 Init 또는 PreInit 이벤트에서 이벤트 처리기를 추가해보십시오.


편집 : 대기, 나는 Dilli-O 잘 될 것 같아요. http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 끝의 리피터에 버튼 컨트롤 추가 섹션을 참조하십시오. 그것은 VB.NET에 있지만, C#에서도 똑같은 일을 쉽게 할 수 있습니다.

2

반복 할 때 각 단추에 CommandName 및 CommandArgument 속성을 할당 해 보았습니까? Repeater 컨트롤은 CommandName 속성이있는 컨트롤이 누적 될 때 발생하는 이벤트 인 ItemCommand 이벤트를 지원합니다.

CommandName 및 CommandArgument 값이 이벤트로 전달되어 쉽게 액세스 할 수 있으므로 처리하기가 쉽습니다.

+0

고든, 체크 아웃 : http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html –

+0

나는 그것을 시도했지만 이벤트는 여전히 해고되지 않고있다. –

1

, 당신이 너무 늦게 페이지 수명주기에서 이벤트 처리기를 추가하고 있습니다. SharePoint WebParts의 경우 일반적으로 클래스의 OnInit/CreateChildControls 메서드를 재정 의하여 작업을 처리하려고합니다.

1

INamingContainer 마커 인터페이스를 구현하려면 webpart가 필요합니다. 포스트 백이 올바른 컨트롤로 돌아갈 수 있도록 프레임 워크에서 사용됩니다 ... 또한 webpart의 컨트롤에 모두 ID가 있어야합니다.

관련 문제