C#,FindControl [重复]

Posted

技术标签:

【中文标题】C#,FindControl [重复]【英文标题】:C#, FindControl [duplicate] 【发布时间】:2010-11-30 06:20:00 【问题描述】:

很抱歉,但我不明白为什么这不起作用。编译后,我收到“空引用异常”。请帮忙。

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>";
    

和用户界面:

<%@ 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>

【问题讨论】:

从哪里得到空引用异常? Label1.Text = "您从下拉菜单中选择了 " + DropDownList1.SelectedValue + ""; 【参考方案1】:

感谢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;

【讨论】:

适用于需要使用 FindControl 时,但在这个问题的示例中 FindControl 是多余的。【参考方案2】:

当母版页上存在 Label1 时:

告诉内容页面你的母版页在哪里

<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %>

然后在master中制作一个方法

public void SetMessage(string message)

    Label1.Text = message;

并在页面后面的代码中调用它。

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

当内容页上存在Label1时

如果只是在同一个页面,调用Label1.Text = someString; 或者如果您出于某种原因需要使用 FindControl,请将您的 Master.FindControl 更改为 FindControl

【讨论】:

+1,删除了我的答案。这是实现您想要的更简单的方法。【参考方案3】:

FindControl 仅在直接子项中搜索(技术上是到下一个NamingContainer),而不是整个控制树。由于Label1 不是Master 的直系子级,Master.FindControl 不会找到它。相反,您要么需要在直接父控件上执行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方便)。

【讨论】:

以上是关于C#,FindControl [重复]的主要内容,如果未能解决你的问题,请参考以下文章

asp.net gridview编辑时,下拉框选择上默认的选项

C#中FindByValueFindControl函数的用法详解

FormView.FindControl() 在 DataBind() 之前返回 null

FindControl() 返回空值

FindControl的使用方法

ASP.net .FindControl() 和 GridView 返回 null