2011-07-26 9 views
3

2つのユーザーコントロールが登録されたASP.NETページがあります。最初のボタンにはボタンが1つしかありません。 2番目は単純なテキストで、デフォルトでは隠されています。私がしたいのは、最初のボタンがクリックされたとき(ボタンクリックイベントのとき)に2番目のものを表示させることです。そのASP.NETページの別のユーザーコントロールのイベント内でASP.NETページのユーザーコントロールを検索する方法EDIT:異なるコンテンツプレースホルダ?

ASP.NETページ:

<%@ Page Title="" Language="C#" CodeFile="test.aspx.cs" Inherits="test" %> 
<%@ Register Src="~/UC_button.ascx" TagName="button" TagPrefix="UC" %> 
<%@ Register Src="~/UC_text.ascx" TagName="text" TagPrefix="UC" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MyTestContent" Runat="Server"> 
    <UC:button ID="showbutton1" runat="server" /> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MyTestContent2" Runat="Server"> 
    <UC:text runat="server" Visible="false" ID="text1" /> 
</asp:Content> 

UC_Button.ascx.cs:

protected void button1_Click(object sender, EventArgs e) 
{ 
    Button btnSender = (Button)sender; 
    Page parentPage = btnSender.Page; 
    UserControl UC_text = (UserControl)parentPage.FindControl("text1"); 
    UC_text.Visible = true; 
} 

私が間違って何をしているのですか?私はよく知られているObject reference not set to an instance of an object.コードの最後の行にエラーが発生します。

編集:私が最初にこれを投稿する際に言及するのを忘れてしまった

一つ。ユーザーコントロールは異なる<asp:Content></asp:Content>コントロールにあります(上の例を編集しました)。同じプレースホルダコードに入れてもうまく動作します。別々のコンテンツプレースホルダーに置くと、findcontrolで検索できません。それはなぜですか、どうすれば見つけることができますか?

答えて

2

[OK]を私は解決策を見つけました。

The FindControl method does not do a deep search for controls. It looks directly in the location you specify for the control you're requesting.

私は別のcontentplaceholdersでユーザーコントロールを持っているのでので、私はまずターゲットとプレースホルダを見つける(ユーザーコントロールが存在する場所)としなければならない:ジェイミー・ディクソンが指摘(あなたのジェイミーに感謝)などの問題があり、私は内部のユーザーコントロールを検索することができます:私はそれが(私は階層にこのコードが壊れるビットを変更する場合は)最善の解決策ではないことを知っているので、本当に不愉快と私を混乱させる何

protected void Dodaj_Feed_Panel_Click(object sender, EventArgs e) 
    { 
     ContentPlaceHolder MySecondContent = (ContentPlaceHolder)this.Parent.Parent.FindControl("MyTestContent2"); 

     UserControl UC_text = (UserControl)MySecondContent.FindControl("text1"); 
     UC_text.Visible = true; 
    } 

this.Parent.Parent一部です。このコード部分が実際に行うことは、ページ階層内で2つ上のレベルになるということです(つまり、両方のユーザーコントロールがあるページです)。私はthis.Pageとの違いは私にとっては同じ意味だが私のために働いていないからだと分かっていない。

長期的な解決策は、サーバー側の「jQueryライクなセレクタ」(階層内のどこにあっても要素を見つけることができます)になります。誰もがより良い解決策を持っていますか?

+2

より良い解決策:MVC :) – drzaus

2

FindControlメソッドは、コントロールの詳細検索を行いません。要求しているコントロールに対して指定した場所が直接表示されます。あなたのケースでは

、何をする必要がありますことのようなものです:IEnumerable and Recursion using yield returnタイプによって深いコントロールを求める方法を示しています。あなたはまた、ここに私の質問を見ることができます

UserControl UC_text = (UserControl)Content1.FindControl("text1"); 

+0

'ページのContent1'は、そのページの内側のユーザーコントロールからアクセス/表示されていない(または私は完全に間違っている?) – Janez

+0

私はあなたが正しいと思います。あなたのコードを見るだけで、FindControlを使わなくてもtext1を直接参照することができます。 –

+0

異なるコンテンツプレースホルダにユーザーコントロールがあるため、直接参照することはできません(同じエラーが表示されます)。私の質問/問題を更新しました。 – Janez

6

以下を確認してください:より良い1は自分の道を来るまで

UserControl UC_text = (UserControl)this.NamingContainer.FindControl("text1"); 
0

ユーザコントロールのIDを使用して、コントロール(例:次いで、パネル内部のGテキストボックス) メインページから

例えば、このコードを試してください。udpatepanelで更新する

TextBox txt = (TextBox)showbutton1.FindControl("Textbox1"); 

を: テキストボックスTXT =(テキストボックス)showbutton1.FindControl( "TextBox1テキストボックス")。 txt.Text = "Hello World!";

((UpdatePanel)showbutton1.FindControl("UpdatePanel1")).Update(); 
関連する問題