2017-11-10 6 views
0

私はいくつかの動的コントロール、例えばTextBoxを作成します。 これらは、ModalPopupExtenderで作成され、ButtonClickの後に作成されます。動的に再作成されたTextBox Page_PreInitの値はHiddenFieldの値に依存します

protected void AddGroupBTN_Click(object sender, EventArgs e) 
{ 
    GroupMPE.Show();//GroupMPE is a ModalPopupExtender 
    ScheduleIdHF.Value = 1; //ScheduleIdHF is a HiddenField declared in the .aspx page 
    CreateControls(ScheduleIdHF.Value); 
    ... 
} 
private void CreateControls(string ScheduleId) 
{ 
    TableRow TR = new TableRow(); 
    TR.ID = "tableRow1"; 
    TableCell TC = new TableCell(); 
    TC.ID = "tableCell1; 
    TextBox textBox = new TextBox(); 
    textBox.ID = "textBox1"; 
    TC.Controls.Add(textBox); 
    TR.Cells.Add(TC); 
    ExampleTable1.Rows.Add(TR);//ExampleTable1 is declared in the .aspx page 

} 

その後、別のボタンがクリックされたとき、私はこのようなPage_PreInitにこれらのコントロールを再作成します。

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    if(IsPostBack) 
     { 
      if (!string.IsNullOrEmpty(ScheduleIdHF.Value)) 
      { 
       CreateControls(ScheduleIdHF.Value); 
       ... 

は、しかし、私はCreateControlsへのメソッド呼び出しは、と HiddenField ScheduleIdHFの値を使用して、上の条件になりたいです。問題は HiddenFieldがヌルで、 Page_PreInitイベントの後に作成されないことです。誰にもこの謎を解く解決策はありますか?ポストバック後に TextBoxのテキストを取得したいからです。

+0

私はそれが可能であるとは思いません。 docs:https://msdn.microsoft.com/en-us/library/ms178472.aspx –

+0

を参照してください。それは非常に簡単です。 – Sunil

答えて

1

のように、のHiddenFieldの値を格納し、PREINITイベントでそれを取得するために、セッション変数を使用してください:あなたは簡単に次のコードを使用して、テキストボックス/のHiddenField値にアクセスすることができます

 protected void Page_PreInit(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      string ScheduleIdHF = string.Empty; 
      if (Session["ScheduleIdHF"] != null) 
      { 
       ScheduleIdHF = Session["ScheduleIdHF"].ToString(); 
       CreateControls(ScheduleIdHF); 
       ... 
      } 
     } 
    } 
+0

私はあなたにupvoteを与え、それが良いものだったのであなたの答えを受け入れました。 –

2

。これは、サーバに投稿されたものがRequestオブジェクトで利用できるという基本的なWebプログラミングのアイデアを使用しているだけです。

コードビハインドPREINITイベントでコントロールの値にアクセスするための

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    if(Page.IsPostBack) { 
     var x = Request[TextBox1.UniqueID]; 
     var y = Request[ScheduleIdHF.UniqueID]; 
     //use values of x and/or y to implement your logic 
     if(y != null && y == "somevalue") { 
      //your custom logic goes here 
     } 
    } 
} 

テキストボックスのマークアップ

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<asp:HiddenField ID="ScheduleIdHF" runat="server" Value="1010"/> 
+0

私はあなたにupvoteを与えましたが、私は@Ernesto Rodriguez Lucasの答えを受け入れました。あなたの答えは良い答えでした。 –

+1

問題ありません。隠しフィールドの値がJavaScriptによってクライアントサイドで変更された場合、Session変数のアプローチは機能しません。それで、私の見解では、それはいつもうまくいくわけではないので、良い解決策ではありません。また、セッション変数はユーザーごとに余分なメモリを消費しますが、これはASP.Netアプリケーションには適していません。あなたは常にあなたのアプリのメモリ消費を最小限に抑えようとするべきです。一方、Request変数アプローチは、ユーザーごとに余分なメモリを消費せず、JavaScriptによって隠しフィールドの値が変更されても常に機能します。 – Sunil

+1

また、セッション変数のアプローチを使用する必要がある場合は、ページライフサイクルの最後に発生するPage_PreRenderイベントでSession変数を設定してください。そうしないと、問題をデバッグするのが難しくなります。 – Sunil

関連する問題