2012-01-08 19 views
2

私はこれで本当に苦労しています。この問題はコンテンツページでのみ発生します。
別のコンテンツページ( "Page2.aspx")のあるコンテンツページ( "Page1.aspx")からテキストボックス値にアクセスしようとしています。私はそれがネストされたマスターページの子であるかどうか分からないが、私はそれを投げたいと思った。入れ子になったマスターページを持つコンテンツページからのコントロールへのアクセス

Page1.aspxは基本的なフォームで、テキストボックスと送信ボタンがある。 Page1.aspxのテキストボックスは "tbFirst"と呼ばれます。

<asp:Button ID="Button1" runat="server" Text="New Member Form" PostBackUrl="Page2.aspx"/>  

にPage2.aspxは、前のページからテキストボックスの値が移入されなければならない新しい形です:送信ボタンは、次のコードを持っています。 2行目の表示<%@ PreviousPageType VirtualPath = "〜/ Page1.aspx"%
テスト目的のために、私は結果を表示するためにラベル( "lblResult")を使用しています。

 if (PreviousPage != null) 
     { 
      TextBox SourceTextBox = 
       (TextBox)PreviousPage.FindControl("tbFirst"); 
      if (SourceTextBox != null) 
      { 
       lblResult.Text = SourceTextBox.Text; 
      } 
      else 
      { 
       lblResult.Text = "No text found"; 
      } 
     } 
     else 
      { 
      lblResult.Text = "No Control found"; 
      } 
     } 
     } 

問題がにPage2.aspxのラベルのテキストは、「テキストが見つからない」と言うことです:

分離コードは次のようになります。

私はすべての関連情報だと思います。誰もがアイデアを持っていますか?私はフォーラム全体を午後に渡り過ごしましたが、私が試したことはありませんでした。

答えて

3

私は彼らが 入れ子になったマスターページの子であることに関連しているかどうかわからないんだけど、私はそれを投げるだろうと思っていた。

MasterPageは、この問題を引き起こしている正確に何であります。ページがTextBoxのNamingContainerではなく、ContentPlaceholderであるため、Page.FindControl("ControlID")を使用してMasterPageのページでコントロールを見つけることができません。ページのControlCollectionとMasterPageの唯一のコントロールは、MasterPage自体です。

理由:私は最近answered a question that describes this behaviourです。ここで

はあなたのPage2からテキストボックスにアクセスする方法をいくつかの方法があります。

  1. あなたがアプローチ(最も直接的FindControl way)次で運を持っているかもしれません:

    Page.Master.FindControl("ContentPlaceHolder1").FindControl("tbFirst"); 
    
  2. もう一つの、より良いアプローチでしょうtbFirst.Textを返す公開プロパティをPage1に指定すると、Page2

    のようにアクセスできます
    if (PreviousPage != null && PreviousPage is Page1){ 
        lblResult.Text = ((Page1)PreviousPage).TbFirstText; 
    } 
    
  3. Page2'sPreviousPagePage1であることを必要としないですように、また、URL、パラメータとしてTextを追加することができます。

  4. 最後に重要なことですが、Server.TranserpreserveFormをtueに設定した場合、Request.Form("TbFirst")を参照して、元のページTextBoxコントロールの値を取得できます。

:それはまた、両方のページをハードワイヤうと

  • 遅い厄介なエラーの原因になりますので、私は、recursive FindControlアプローチ(MasterPageから始まる)をお勧めしません。
  • 不透明
+1

おかげ - ジューシーなアイデアの数がありますが、私が最初に寝た後、それを試してみる必要があります! – bjh

+0

ありがとうTim。 1位(解決策とバリエーション)はすでに何回も失敗していました。 – bjh

+0

ありがとう@Tim。第1の解決策(およびバリエーション)は何度も失敗していました。ソリューション2は、URLパラメータである3を使いました。 [How to:ASP.NET Webページ間で値を渡す](http://msdn.microsoft.com/en-us/library/6c3yckfw.aspx)で、これらの各ソリューションの詳細が見つかりましたが、取得しようとしていましたソリューションのうち明快さを提供してくれてありがとう:-) – bjh

0

このクラスのFindControlRecursive(this.Master, "tbFirst")を使用します。

(にApp_Codeでこのクラスを入れて)

using System.Web; 
using System; 
using System.Web.UI; 
using System.Web.UI.WebControls; 


/// <summary> 
/// Summary description for ControlHelper 
/// </summary> 
public static class ControlHelper 
{ 
    // Example: HtmlForm form = ControlHelper.FindControlRecursive(this.Master, "form1") as HtmlForm; 
    /// <summary> 
    /// Finds a Control recursively. Note finds the first match and exits 
    /// </summary> 
    /// <param name="ContainerCtl"></param> 
    /// <param name="IdToFind"></param> 
    /// <returns></returns> 
    public static Control FindControlRecursive(this Control Root, string Id) 
    { 
     if (Root.ID == Id) 
      return Root; 

     foreach (Control Ctl in Root.Controls) 
     { 
      Control FoundCtl = FindControlRecursive(Ctl, Id); 
      if (FoundCtl != null) 
       return FoundCtl; 
     } 

     return null; 
    } 

    //ModifyControl<TextBox>(this, tb => tb.Text = "test"); 
    public static void ModifyControl<T>(this Control root, Action<T> action) where T : Control 
    { 
     if (root is T) 
      action((T)root); 
     foreach (Control control in root.Controls) 
      ModifyControl<T>(control, action); 
    } 
} 
関連する問題