15

使用時に問題が発生してLoadControl( type, Params )います。説明させてください...

私は非常にシンプルなユーザーコントロール(ascx)を持っています

<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

以下のコード ( c# ) を使用:

public partial class ErrorDisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public ErrorDisplay()
    {
    }

    public ErrorDisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

Web アプリケーションの他の場所で、次のコードを使用して、ユーザー コントロールのインスタンスをページに追加しています。

divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));   

Message パラメーターをコンストラクターに渡したいので、オーバーロードされたバージョンの LoadControl を使用しています。これはすべて正常に機能しているようです。

ただし、が ErrorDisplay ユーザー コントロールで起動されると、同等のマークアップがあるにもかかわらず、OnPreRender()lblTitle 変数と lblDescription 変数は両方ともになります。nullメッセージ変数が正しく取り込まれました。

なぜこれが起こっているのか、誰かが光を当てることができますか?

ありがとう

編集:

わかりやすくするために、ユーザーコントロールをプログラムでページに追加するコードがボタンの押下に応答して実行されていることも追加します。そのため、「ホスティングページ」は Init、Page_Load を介して進行し、現在イベントハンドラーを処理しています。

ユーザー コントロールは、ボタン クリック イベントに応答して作成されているため、asp ライフサイクルの初期段階で追加できません。

4

6 に答える 6

23

次のコードも試しました-同じ結果が得られます(つまり、lblTitleとlblDescriptionの両方がnullです)

protected void Page_Load(object sender, EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

LoadControl関数は、ロードしているコントロールを、それが含まれているページの現在の「状態」まで持ってくることを理解しました。したがって、Init、Page_LoadなどはすべてLoadControl呼び出しの一部として実行されます。

興味深いことに、この(未回答の)asp.netフォーラムの投稿は、私が経験しているのと同じ問題を示しています。

MSDNフォーラムの投稿

さらに-MSDNから:

コントロールをコンテナコントロールにロードすると、コンテナは、現在のイベントに追いつくまで、追加されたコントロールのすべてのイベントを発生させます。ただし、追加されたコントロールはポストバックデータ処理に追いつきません。追加されたコントロールを検証を含むポストバックデータ処理に参加させるには、コントロールをLoadイベントではなくInitイベントに追加する必要があります。

したがって、LoadControlはコントロールを正しく初期化するべきではありませんか?

編集:

わかりました、それで私はここで私自身の質問に答えています..

上記にリンクしたフォーラム投稿の回答済みバージョンをここで見つけました

基本的に、答えは、LoadControl( type, params )解析する「ページインフロント」ascxを推測できないため、コントロールを初期化する必要がないということです。このバージョンを使用するLoadControl( "ascx path" )と、ページが前面に表示されるため、すべての解析と初期化が行われます。

したがって、要約すると、コントロールを初期化するコードを変更し、それを別々の部分に分割する必要があります。つまり

Control ErrorCntrl = LoadControl("ErrorDisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as ErrorDisplay).SetErrorMessage = MessageDetail;
divErrorContainer.Controls.Add(ErrorCntrl);

そして、それはうまくいくはずです..それは私の前の試みほどきちんとしていませんが、少なくともそれはうまくいくでしょう。

私はまだ上記を改善するための提案を受け入れています。

乾杯

于 2008-10-27T18:41:45.787 に答える
0

Mitchelに同意すると、コントロールが完全に利用可能になった後に起動するコントロールコード自体にpage_loadを配置できるはずです。

于 2008-10-27T18:17:18.283 に答える
0

コンストラクターを実行してページにコントロールを追加した後に、独自のロード イベントを追加して呼び出すことは常にありますが、スタイル上の理由から選択することはできますが、それはあなたが持っているものと大差ありません。

あなたの問題に対する答えを見つけてよかったです!

于 2008-10-27T21:49:41.587 に答える
0

e.Cell.Controls コレクションにユーザー コントロールを追加したいという点で、Calendar コントロールの DayRender イベントで同様の問題がありました。ユーザー コントロール page_load が起動しない、または ascx のリストボックスが null 例外をスローするといういくつかの失敗したアプローチを試みた後、LoadControl(ascx) を使用してフォーム上のコントロールを初期化し、その後でマークアップ コントロールへのアクセスを開始すると、 ascx、すべて正常に機能しました。このアプローチは、ascx の Page_Load イベントにはまったく依存しません。

ASCX マークアップ

コードビハインド

Public Class CPCalendarCell Inherits System.Web.UI.UserControl

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

Public Sub Add(txt As String)
    Dim li As New ListItem(txt, txt)
    lstDay.Items.Add(li)
End Sub

クラス終了

ページ ASPX マークアップ

フォーム上のカレンダー DayRender イベントの背後にあるコード

Private Sub Calendar1_DayRender(sender As Object, e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
    Dim div As CPCalendarCell = LoadControl("~/UserControls/CPCalendarCell.ascx")
    div.ID = "dv_" & e.Day.Date.ToShortDateString.Replace(" ", "_")

    **e.Cell.Controls.Add(div)**

    div.Add(e.Day.Date.Month.ToString & "/" & e.Day.Date.Day.ToString)
    div.Add("Item 1")
    div.Add("Item 2")
    e.Cell.Style.Add("background-color", IIf(e.Day.IsWeekend, "whitesmoke", "white").ToString)
End Sub
于 2014-04-20T15:29:01.397 に答える
0

これは、Steven Robbinsによって書かれたブログ投稿です。この投稿では、 を使用してユーザー コントロールのパラメーターを渡す方法について説明してLoadControlLoadControl(Type, object[])ます

于 2013-11-26T14:46:25.973 に答える
-1

asp.net ページのライフサイクルごとに、コントロールが事前レンダリングに完全に追加されていません。page_load で値をロードしないのはなぜですか?

于 2008-10-27T18:02:03.433 に答える