4

私の質問をするために、私はSqlDataSourceでとaspx含むファイルを作成しました:ButtonDataList

    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

    <asp:DataList ID="DataList1" runat="server" DataKeyField="a" 
    DataSourceID="SqlDataSource1" >
        <ItemTemplate>
            a:
            <asp:Label ID="aLabel" runat="server" Text='<%# Eval("a") %>' />
            <br />
            b:
            <asp:Label ID="bLabel" runat="server" Text='<%# Eval("b") %>' />
            <br />
        </ItemTemplate>
    </asp:DataList>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:probaConnectionString %>" 
    SelectCommand="SELECT [a], [b] FROM [PROBA_TABLE]"></asp:SqlDataSource>

背後にあるコードTextBoxesで、DataListのItemsに追加します。すべてのアイテムにPage_LoadのTextBoxを追加し、ButtonClickの別のTextBoxも追加しますeventhandler

    public partial class _Default : System.Web.UI.Page
    {   
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                foreach (DataListItem item in DataList1.Items)
                {
                    item.Controls.Add(new TextBox());
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            foreach (DataListItem item in DataList1.Items)
            {
                item.Controls.Add(new TextBox());
            }
        }

    }
}

これは、1つを除いて正常に機能します。ボタンをクリックすると、Page_Loadで作成されたTextBoxはText値を保持しますが、で作成されたTextBoxはButton1_ClickText値を失います。私の本当の問題はこれよりも複雑ですが、これを解決することは私に大いに役立つと思います。

ポストバック後の私のサイト

4

2 に答える 2

3

ページViewStateからデータを受信する必要がある各コントロールは、InitまたはLoadイベントハンドラーでインスタンス化する必要があります。これは、ViewStateがクリック、変更、および残りのコントロールイベントの前にコントロールに永続化されるためです(これらのイベントは、ViewStateの変更が検出されたときにトリガーされるため、ViewStateを読み取る必要があります。Clickイベントが発生する前)。

したがって、プロセスは次のようになります。

  1. OnInit(静的コントロールが作成されます)
  2. 静的制御コンテンツはViewStateから逆シリアル化されます
  3. OnLoad(ダイナミックコントロールを作成します。この場合、前回のポストバックで作成したテキストボックスを作成します)
  4. 動的制御コンテンツはViewStateから逆シリアル化されます
  5. POSTデータとViewStateデータを比較して検出された変更に応じて、クリック、変更、およびその他のイベントが発生します

提案:

非表示フィールドを使用して追加のステータス情報を保存し、OnLoadでその情報を読み取って、動的に作成されたコントロールを再作成できます。

また、ASP.Netに依存せずに、値を適切に永続化できるように、テキストボックスのIDプロパティを明示的に設定する必要があります。

于 2013-01-27T10:20:31.547 に答える
0

httpはデフォルトでステートレスです。つまり、リクエストが処理された後、サーバーはリクエストのデータや情報を保持しませんが、長いフォームに入力してから
エラーが発生した場合に備えて、フォームの値を保持する必要があります。

エラーメッセージを受け取るためだけにサーバーにポストバックすると、入力された値はすべてなくなります。煩わしいことではない

ので、asp.netが舞台裏で行うことにより、すべてのサーバーコントロールとそのIDに関する情報を含む文字列がページに非表示になり
、フォームをポストバックすると、Page classが作成され、値が作成されます。はすべてのリクエストで作成されている
ため、ポストバックされ、特定のコントロールにバインドされます。Page classpageLoadイベントが実行され、PageLoadで作成されたコントロールは現在価値であり、ビューステートがすでに脱セラル化されて値が入力されているイベントが実行されるまで、
ボタンクリックで作成されているコントロールとは異なり、 IDに対応する値が入力されます。
button_click

于 2013-01-27T10:31:58.313 に答える