簡體   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