0

一部のデータにバインドされたリピーターがあります。

ItemDataBoundイベントにバインドし、プログラムでUserControlを作成しようとしています:

手短に:

void rptrTaskList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    CCTask task = (CCTask)e.Item.DataItem;

    if (task is ExecTask)
    {
        ExecTaskControl foo = new ExecTaskControl();
        e.Item.Controls.Add(foo);
    }
}

問題は、バインドが機能している間、ユーザー コントロールがメイン ページにレンダリングされないことです。

4

4 に答える 4

1

問題を逆転させることを検討できます。つまり、リピーター定義にコントロールを追加し、不要な場合は削除します。アプリの詳細がわからない場合、これは時間の無駄になる可能性がありますが、最終的にはうまくいく可能性があります。

于 2008-08-27T00:38:23.060 に答える
1

ええ、それを行う1つの方法を考え出しました:

ExecTaskControl foo = (ExecTaskControl)LoadControl("tasks\\ExecTaskControl.ascx");

そのようなファイル依存性を持つのはばかげているように思えますが、おそらくそれが UserControls を実行する方法です。

于 2008-08-26T22:18:34.177 に答える
0

あなたが解決している問題の詳細に応じて、@Craigは正しい軌道に乗っていると思います。リピーターに追加して削除するか、Visible="false" を設定して、必要な場所で非表示にします。Viewstate は、動的に作成されたコントロール/ユーザー コントロールでは扱いにくいため、Google で検索するか、動的に追加する必要があるかどうかを確認してください。参照されている記事には、動的にロードする別の方法も示されています。

Control ctrl=this.LoadControl(Request.ApplicationPath +"/Controls/" +ControlName);

于 2008-08-27T04:15:45.597 に答える
0

ページのインスタンスがない場所から実行する場合は、さらに一歩進める必要があります (たとえば、web サービスから html を返すか、電子メールをレンダリングするタスクから)。

var myPage = new System.Web.UI.Page();
var myControl = (Controls.MemberRating)myPage.LoadControl("~/Controls/MemberRating.ascx");

Scott Guithrie のサイトでこの手法を見つけたので、.NET でそれを行う正当な方法だと思います。

于 2008-08-27T04:52:59.797 に答える