繁体   English   中英

C#ASP.NET FindControl不断返回null

[英]C# ASP.NET FindControl keeps returning null

我的网页中有一个TextBox和一个Button 用户在TextBox输入一个数字,然后单击Button ,这将在Panel创建(n + 1)个TextBox

如您在代码中所看到的,我再次为TextBox实例分配了ID ,再次尝试使用FindControl()访问TextBox实例时,我一直为最后一个TextBox (ID:f1)收到NullReferenceException ,我是什么?这里做错了吗?

最初, Button1.Text不是"Find"

protected void Button1_Click(object sender, EventArgs e)
{
    if (Button1.Text.Equals("Find"))
    {
        for (int i = 0; i < size; i++)
        {
            TextBox tb = (TextBox)Panel1.FindControl("Number" + i);
            n[i] = Convert.ToInt32(tb.Text);
        }
        localhost.Search s = new localhost.Search();
        resultLabel = new Label();
        TextBox tb1 = (TextBox)Panel1.FindControl("f1");
        int fNumber = Convert.ToInt32(tb1.Text);            // tb1 is null
        if (s.LinearSearch(n, fNumber))
            resultLabel.Text = "FOUND!";
        else
            resultLabel.Text = "NOT FOUND!";
        form1.Controls.Add(resultLabel);
    }
    else
    {
        size = Convert.ToInt32(TextBox1.Text);
        n = new int[size];
        TextBox1.Enabled = false;
        boxes = new TextBox[size];
        for (int i = 0; i < size; i++)
        {
            Label l = new Label();
            l.Text = "Number " + (i + 1) + " : ";
            boxes[i] = new TextBox();
            boxes[i].ID = "Number" + i;
            Panel1.Controls.Add(l);
            Panel1.Controls.Add(boxes[i]);
        }
        Label l1 = new Label();
        l1.Text = "Find Number : ";
        Panel1.Controls.Add(l1);
        findBox = new TextBox();
        findBox.ID = "f1";
        Debug.Write("[!D] ID : "+findBox.ID);
        Panel1.Controls.Add(findBox);
        Button1.Text = "Find";
    }
}

页面的ASPX代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        How Many Numbers&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
&nbsp;&nbsp;&nbsp;
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="OK" />
        <br />
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>

    </div>
    </form>
</body>
</html>

尝试在整个页面上搜索ID f1而不是在面板中搜索。

TextBox tb1 = (TextBox)FindControl("f1");

在您的文本框中添加ID

<asp:TextBox ID="f1" runat="server"></asp:TextBox>

在aspx页面中,没有f1 ID,因此尝试获取元素的Text时会得到null引用异常。

无论何时创建动态控件,都需要在回发时重新创建它。 希望这可以帮助

protected void Button1_Click(object sender, EventArgs e)
    {
        CreateControls();
        if (Button1.Text.Equals("Find"))
        {

            for (int i = 0; i < size; i++)
            {
                 TextBox tb = (TextBox)Panel1.FindControl("Number" + i);
                 n[i] = Convert.ToInt32(tb.Text);
            }
           localhost.Search s = new localhost.Search();
           resultLabel = new Label();
           TextBox tb1 = (TextBox)Panel1.FindControl("f1");
           int fNumber = Convert.ToInt32(tb1.Text);            // tb1 is null
         if (s.LinearSearch(n, fNumber))
           resultLabel.Text = "FOUND!";
        else
          resultLabel.Text = "NOT FOUND!";
        form1.Controls.Add(resultLabel);
       }
        else
        {
            Button1.Text = "Find";
        }


    }

    protected void CreateControls()
    {
        var size = Convert.ToInt32(TextBox1.Text);
        var n = new int[size];
            TextBox1.Enabled = false;
            var boxes = new TextBox[size];
            for (int i = 0; i < size; i++)
            {
                Label l = new Label();
                l.Text = "Number " + (i + 1) + " : ";
                boxes[i] = new TextBox();
                boxes[i].ID = "Number" + i;
                Panel1.Controls.Add(l);
                Panel1.Controls.Add(boxes[i]);
            }
            Label l1 = new Label();
            l1.Text = "Find Number : ";
            Panel1.Controls.Add(l1);
            var findBox = new TextBox();
            findBox.ID = "f1";
            Debug.Write("[!D] ID : " + findBox.ID);
            Panel1.Controls.Add(findBox);

        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM