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 は呼び出されません。ただし、デバッガーでイベントハンドラーとして追加されていることがわかります。

何か案は?私はこれを行う方法に困惑しています。

4

6 に答える 6

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
    }                          
 }
于 2008-09-23T18:44:14.383 に答える
2

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

CommandName と CommandArgument の値がイベントに渡され、すぐにアクセスできるため、そこからの処理は簡単です。

于 2008-09-23T18:32:23.477 に答える
1

他の人が指摘しているように、ページのライフ サイクルの後半にイベント ハンドラーを追加しています。SharePoint WebParts の場合、通常、クラスの OnInit/CreateChildControls メソッドをオーバーライドして、アクティビティを処理します。

于 2008-09-23T22:38:18.033 に答える
1

INamingContainerマーカー インターフェイスを実装するには、Web パーツが必要です。これは、ポストバックが正しいコントロールに戻ることを可能にするためにフレームワークによって使用されます。また、Web パーツのコントロールにはすべて ID が必要です。

于 2009-08-26T15:35:47.967 に答える
1

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

記事 @ 4guysfromrolla

于 2008-09-23T18:29:47.447 に答える
1

SharePoint Web パーツを作成したことがないので、これが当てはまるかどうかはわかりません。しかし、それが昔ながらの apsx ページである場合、レンダリングするまでには手遅れであると言えます。コントロールの Init または PreInit イベントにイベント ハンドラを追加してみてください。


編集:待ってください、Dilli-O が正しいと思います。http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.htmlの最後にある「リピーターへのボタン コントロールの追加」セクションを参照してください。VB.NET ですが、C# でも同じことが簡単にできます。

于 2008-09-23T18:31:24.633 に答える