2009-09-22 11 views
8

申し訳ありませんが、なぜこれが機能しないのか理解できません。コンパイル後、私は "Null参照例外"を受け取ります。助けてください。C#、FindControl

public partial class labs_test : System.Web.UI.Page 
{ 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (TextBox1.Text != "") 
     { 
      Label Label1 = (Label)Master.FindControl("Label1"); 
      Label1.Text = "<b>The text you entered was: " + TextBox1.Text + ".</b>"; 
     } 
    } 

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Label Label1 = (Label)Master.FindControl("Label1"); 
     Label1.Text = "<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>"; 
    } 
} 

とUI:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="labs_test" Title="Untitled Page" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 
Type in text and then click button to display text in a Label that is in the MasterPage.<br /> 
This is done using FindControl.<br /> 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" /><br /> 
<br /> 
Choose an item from the below list and it will be displayed in the Label that is 
in the MasterPage.<br /> 
This is done using FindControl.<br /> 
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> 
<asp:ListItem>Item 1</asp:ListItem> 
<asp:ListItem>Item 2</asp:ListItem> 
<asp:ListItem>Item 3</asp:ListItem> 
</asp:DropDownList> 
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>  
</asp:Content> 
+0

ここで、null参照例外はありますか? – Joren

+0

Label1.Text = "" "+ DropDownList1.SelectedValue +"をドロップダウンメニューから選択しました "; – AlexC

+0

可能な複製http://stackoverflow.com/questions/799655/asp-net-findcontrol-is-not-working-how-come –

答えて

22

礼儀Mr. Atwood himselfの礼儀をしています。私はまた、コントロールのnullをテストすることをお勧めし、私はあなたもそれを行うためにコードを変更することができますが含まれています。

protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (TextBox1.Text != "") 
    { 
     Label Label1 = FindControlRecursive(Page, "Label1") as Label; 
     if(Label1 != null) 
      Label1.Text = "<b>The text you entered was: " + TextBox1.Text + ".</b>"; 
    } 
} 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Label Label1 = FindControlRecursive(Page, "Label1") as Label; 
    if (Label1 != null) 
     Label1.Text = "<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>"; 
} 

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) return root; 
    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) return t; 
    } 
    return null; 
} 
+0

ありがとうございました!!!!!!! – AlexC

+2

FindControlを使用する必要がある場合に適していますが、この質問の例ではFindControlが過剰です。 – CRice

2

FindControlのみ直接の子(技術的には次のNamingContainerまで)全体ではなく、コントロールツリーで検索します。 Label1Masterの直下の子ではないため、Master.FindControlは見つからないでしょう。

private Control FindControlRecursive(Control ctrl, string id) 
{ 
    if(ctrl.ID == id) 
    { 
     return ctrl; 
    } 
    foreach (Control child in ctrl.Controls) 
    { 
     Control t = FindControlRecursive(child, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 
    return null; 
} 

(これはextension methodとして便利であることに注意してください):代わりに、あなたのいずれかが直接の親コントロールにFindControlを行う、または再帰的な制御検索を実行する必要があります。

3

のLabel1は、マスターページ上に存在する:あなたのマスターページが

public void SetMessage(string message) 
{ 
    Label1.Text = message; 
} 
のようにマスターに方法を作る次に
<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %> 

あるコンテンツページを語っについて

方法

そしてページのコードの中でそれを呼び出します。

Master.SetMessage("<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>"); 

のLabel1は、コンテンツページ上に存在する

それは同じページに単純である場合は、ちょうどます。Label1.Text = someString呼び出します。 何らかの理由でFindControlを使用する必要がある場合は、Master.FindControlをFindControlに変更してください。

+0

+1、私の答えを削除しました。これはあなたが望むものを達成するためのはるかに簡単な方法です。 – Kelsey

関連する問題