0

ユーザーがボタンをクリックしたときに、パネル内に Gridview を持つ AJAX 折りたたみ可能パネルを含む Web ユーザー コントロールを動的に追加しようとしています。ユーザー コントロールの単一のインスタンスを追加することはできますが、追加のユーザー コントロールを追加すると、次のエラーがスローされます。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: PreRender の後にエクステンダー コントロールを登録できない場合があります。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

私はASP.NET開発に不慣れで、ポストバックを処理するために使用している方法は、ユーザーコントロールをリストに保存し、それらをprerenderメソッド呼び出しで再度追加することです。何をすべきか、またはユーザー コントロールの作成を正しく処理しているかどうかがわかりません。アドバイスをいただければ幸いです。

バックエンドコードは次のとおりです。

public partial class Test : System.Web.UI.Page
{
    private IList<Control> _persistedControls;
    private const string PersistedControlsSessionKey = "thispage_persistedcontrols";

static int count = 1;
private IList<Control> PersistedControls()
{
    if (_persistedControls == null)
    {
        if (Session[PersistedControlsSessionKey] == null)
            Session[PersistedControlsSessionKey] = new List<Control>();
        _persistedControls = Session[PersistedControlsSessionKey] as IList<Control>;
    }
    return _persistedControls;
}

protected void Page_Load(object sender, EventArgs e)
{
    PersistedControls();
}

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    IList<Control> controlsToGenerate = PersistedControls();

    // regenerate dynamically created controls
    foreach (var control in controlsToGenerate)
    {
        MasterPanel.Controls.Add(control);
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    Control control = LoadControl("~/WebUserControl/UseCaseSetupUserControl.ascx");
    control.ID = "uc" + count++.ToString();
    MasterPanel.Controls.Add(control);
    _persistedControls.Add(control);
    MasterPanel.Controls.Add(new LiteralControl("<br />"));
    _persistedControls.Add(new LiteralControl("<br />"));  
}

}

ASPX コードは次のとおりです。

   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
        <div>    
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
            <br />
            <asp:Panel ID="MasterPanel" runat="server">
            </asp:Panel>    
        </div>
    </form>
</body>
</html>
4

1 に答える 1

0

ページ ライフ サイクルのできるだけ早い段階でコントロールを作成します。

オン ロードがPersistedControlsあるため、コントロール コレクションに追加する必要があります。でコントロールを追加するのに最適な場所Init

本当にそれができない場合は、を使用してくださいLoad

これをイベントで行う必要がある場合は、最初にそこにコントロールを追加できますが、それを永続化し、次のポストバック以降のInit または Loadに戻すことを忘れないでください。

PreRenderにデータを追加できなくなった後にコントロールを追加すると、 ViewState. SaveViewState は の直前に発生しPreRenderます。ViewState多くのコントロールは、適切に機能するために に大きく依存しています。例外は、ページのライフサイクルの早い段階でコントロールを追加する必要があることを示しているだけです。

于 2012-08-10T18:23:31.840 に答える