2011-07-06 19 views
1

IsPostBackパラメータがtrueのときにページ読み込み時にプログラムで作成されたasp.netコントロールでプロパティ(例:Text)を取得するにはどうすればよいですか?asp-controlで 'Text'プロパティを取得できません

スキーマ:ページ内のコントロールを作成する

  • (例えばTextBox box = new TextBox(); box.ID = "BoxID"
  • 表示制御(例えばSomeControlInPageID.Controls.Add(box)
  • ユーザーは、ID​​で(このテキストボックスを参照してください、私たちはに可能性を持っていませんコントロールはプログラムで作成されたので、BoxID.Textを取得してください!)にテキストを入力します。
  • ユーザーがページ内のボタン(asp:ボタン)をクリックして開始ページrel ... oadingプロセス
  • 開始Page_Loadメソッド& IsPostBackプロパティパラメータが
  • iはPage_LoadメソッドでTextプロパティを取得するには、このコードを使用しようとする真の値を取るが、それが動作していない:

    void Page_Load() 
    { 
        if (Page.IsPostBack) 
        { 
        TextBox box = SomeControlInPageID.FindControl("BoxID") as TextBox; 
        string result = box.Text; 
        } 
        else 
        { 
        // creating controls programatically and display them in page 
        ... 
        } 
    } 
    
このコードの

box.Textは常にnull値をとります。

+0

テキストボックスコントロールを作成するイベントです。おそらくそれはページのInitイベントでなければなりません。ポストバック中にコントロールにアクセスする前にコントロールを再作成する必要があります – MUS

+0

@Romanこの問題は何かありましたか? – rsbarro

答えて

2

キーはあなたがダイナミックコントロールページが読み込まれるたびに再作成することを確認する必要があります。コントロールが作成されると、ASP.NETはポストバック値をそれらのコントロールに埋め込むことができます。私は以下の完全な実例を含めました。通知OnInitイベント(Page_Loadより前に発生)でコントロールを追加し、ポストバックが発生した場合はPage_Loadイベントで値を読み取ることができます。

<%@ Page Language="C#" AutoEventWireup="true" %> 
<html> 
<body> 
    <form id="form1" runat="server"> 
    <asp:Panel ID="myPanel" runat="server" /> 
    <asp:Button ID="btnSubmit" Text="Submit" runat="server" /> 
    <br /> 
    Text is: <asp:Literal ID="litText" runat="server" /> 
    </form> 
</body> 
</html> 
<script runat="server"> 
protected void Page_Load(object sender, System.EventArgs e) 
{ 
    if(Page.IsPostBack) 
    { 
     var myTextbox = myPanel.FindControl("myTextbox") as TextBox; 
     litText.Text = myTextbox == null ? "(null)" : myTextbox.Text; 
    } 
} 

protected override void OnInit(EventArgs e) 
{ 
    AddDynamicControl(); 
    base.OnInit(e); 
} 

private void AddDynamicControl() 
{ 
    var myTextbox = new TextBox(); 
    myTextbox.ID = "myTextbox"; 
    myPanel.Controls.Add(myTextbox); 
} 
</script> 
1

aspxページのページライフサイクルをご覧ください。 Page_Initハンドラ内にテキストボックスを追加する必要があります。その後、page_loadイベントでtextBoxにアクセスすることができます。ここ

protected void Page_Init(object sender, EventArgs e) 
{ 
    TextBox tb = new TextBox(); 
    tb.ID = "textbox1"; 
    tb.AutoPostBack = true; 
    form1.Controls.Add(tb); 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    /// in case there are no other elements on your page 
    TextBox tb = (TextBox)form1.Controls[1]; 
    /// or you iterate through all Controls and search for a textbox with the ID 'textbox1' 
    if (Page.IsPostBack) 
    { 
     Debug.WriteLine(tb.Text); /// only for test purpose (System.Diagnostics needed) 
    }   
} 

HTH

関連する問題