4

わかりました。動的な(作成された)コントロールとそのビューステートをasp.netに保持するには、Page initイベントでそれらを(再)作成する必要があることをすでに学びました。これにより、ビューの前にページのコントロール階層内に既に存在します。状態がロードされます。

この記事で言うように。

これらのコントロールを作成するための基準がデータベースなどのWeb環境の外部にある場合は、この動作を実現するのに問題はありません。しかし、作成する必要のある動的コントロールの数を決定するために使用するものが、実際にはコントロールにある値である場合はどうすればよいですか?

私はそれを例で説明しようとします、多分それはより明確です:

テキストボックスと2つのボタンがあるとしましょう。テキストボックスに、作成する動的コントロールの数、たとえば4つのチェックボックスを書き込みます。button1を押すと、コントロールが作成されます。問題ない。次に、いくつかのチェックボックスをオンにして、postbackを起動するためだけにbutton2を押します。ここで、コントロールとその状態を維持するために、前に述べたように、ページのinitイベントでコントロールを再作成する必要があります。

そして、ここに問題があります初期段階にあるため、ビューステートがないため、作成する動的チェックボックスの数を示すテキストボックスの値にアクセスできません。

セッションオブジェクトに値を格納することでうまくいくと思いましたが、そうではありません。セッションオブジェクトにもアクセスできません。

initイベントからもアクセスできる値をどこに保存できますか?

長い投稿をありがとう、ごめんなさい!

4

3 に答える 3

1

まず、テキストボックスの値はビューステートから保存/取得されません。ビューステートからテキストボックスの値を取得することはできません。実際の問題になりますが、これが(imp)イベントのシーケンスです。init->ビューステートのロード->ポストバックデータのバインド->ページのロード。テキストボックスの値を取得できるのは、バインドポストバックデータイベント(実際に投稿されたデータを取得してテキストボックスコントロールにバインドする)の後でのみです。initでの唯一のオプションは、Request.Form{"textboxid"]を使用してテキストボックスの値を取得することです。

于 2013-03-26T14:54:30.383 に答える
0

あなたは正しい方向に進んでいます。

TextBoxを使用する場合、TextBoxコントロールにはすでに独自のViewStateがあるため、作成されたコントロールの数を追跡するために別のViewStateは必要ありません。

Page_InitまたはPage_Loadのいずれかを使用して、制御をロードバックできます。

ここに画像の説明を入力してください

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
    Inherits="WebApplication2010.WebForm1" %>
<!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">
    <div>
        <asp:TextBox runat="server" ID="NumberTextBox" />
        <asp:Button runat="server" ID="CreateControlButton" 
            OnClick="CreateControlButton_Click"
            Text="Create Control" />
        <br />
        <asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
    </div>
    </form>
</body>
</html>

using System;
using System.Web.UI;

namespace WebApplication2010
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                int ids;
                if (Int32.TryParse(NumberTextBox.Text, out ids))
                {
                    for (int i = 0; i < ids; i++)
                    {
                        Control ctrl = Page.LoadControl("WebUserControl.ascx");
                        ctrl.ID = i.ToString();
                        PlaceHolder1.Controls.Add(ctrl);
                    }
                }
            }
        }

        protected void CreateControlButton_Click(object sender, EventArgs e)
        {

        }
    }
}

<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="WebUserControl.ascx.cs"
    Inherits="WebApplication2010.WebUserControl" %>
<asp:CheckBox runat="server" ID="CheckBox1" />
<asp:Button runat="server" ID="Button1" OnClick="Button_Click" 
    Text="Post Back" />
<asp:Label runat="server" ID="Label1" />
<br />

using System;

namespace WebApplication2010
{
    public partial class WebUserControl : System.Web.UI.UserControl
    {
        protected void Button_Click(object sender, EventArgs e)
        {
            Label1.Text = " This control was posted back.";
        }
    }
}
于 2013-03-26T15:03:49.267 に答える
0

これは、コードビハインドで作業する場合のページライフサイクルの一般的なパラドックスです。たとえば、編集中のcustomeridをビューステートに保存しますが、投稿された値を読み取れるようにするには、コントロールをinitにバインドする必要があります。

最良の実際の解決策は、バインドされたコントロールがポストバックで行うことを実行し、Page Loadイベントで作成した後、すべてのコントロールが実装するIPostBackDataHandlerインターフェイスでLoadPostBackDataを明示的に呼び出すことです。

Controlsの拡張メソッドを作成し、必要に応じて呼び出す必要があります。control.DataBind(); control.LoadPostedData(); //拡張メソッド

于 2014-10-24T16:49:38.110 に答える