ASP.NET - RenderContent呼び出しでRepeater内のLinkBut​​tonにイベントハンドラを追加する


4

カスタムユーザーコントロールを読み込むSharepoint WebPartがあります。ユーザーコントロールには複数のLinkBut​​tonが含まれているRepeaterが含まれています。

は、WebパーツでRenderContentコールでは、私は、イベントハンドラを追加するためのいくつかのコードを持っている:

 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()関数でイベントハンドラを追加しようとしていますが、まだ呼び出されていません。これまでのすべての助けをありがとう、それは認められている 24 9月. 082008-09-24 15:49:16

+1

ゲームの後半にこれを見ている人のために。 CreateChildControlsを使用しないでください...それはサイクルでまだ遅すぎます。代わりに、OnInitハンドラをオーバーライドしてすべてのダイナミックコントロールを構築します。 03 9月. 092009-09-03 01:51:45

6

RenderContent()が呼び出されるまでに、登録されたすべてのイベントハンドラがフレームワークによって呼び出されました。あなたは、読み込み時()のように、以前の方法でイベントハンドラを追加する必要があります。他の人が指摘したように

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()メソッドのイベントハンドラを追加するコードを使用するようになりました。ありがとう 24 9月. 082008-09-24 15:46:32


1

リンクボタンがコントロールツリーに再追加されていること、および/またはイベントが発生する前にコントロールにイベントが再配線されていることを確認する必要があります。

Article @ 4guysfromrolla


1

私は、SharePointのWebパーツをやったことがないので、これが適用されるかどうかはわかりません。しかし、それが普通の古いapsxのページだったなら、レンダリングするまでには遅すぎると言いたい。コントロールのInitまたはPreInitイベントにイベントハンドラを追加してみてください。


編集:私はディリ-Oは、右のかもしれないと思う、待ってください。 http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html末尾のリピータセクションにボタンコントロールを追加するを参照してください。それはVB.NETにありますが、C#で同じことを簡単に行うことができます。


2

繰り返し実行するときに、各ボタンにCommandNameプロパティとCommandArgumentプロパティを割り当ててみましたか? RepeaterコントロールはItemCommandイベントをサポートしています。これは、CommandNameプロパティを持つコントロールがヒットしたときに発生するイベントです。

CommandName値とCommandArgument値がイベントに渡され、すぐにアクセスできるため、処理が容易です。

  0

ゴードン、チェックアウト:http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 23 9月. 082008-09-23 18:48:45

  0

私はそれを試みましたが、イベントはまだ解雇されていません 24 9月. 082008-09-24 15:47:38


1

、あなたは遅すぎるページのライフサイクルでのイベントハンドラを追加しています。 SharePoint WebPartsの場合は、通常、アクティビティを処理するために、クラスのOnInit/CreateChildControlsメソッドをオーバーライドする必要があります。


1

あなたはINamingContainerマーカーインタフェースを実装するために、ポストバックが正しい制御に復帰できるようにするためにフレームワークによって使用され、あなたのWebパーツを必要とする...あなたのWebパーツで また、コントロールはすべて、IDを持っている必要があります。