[英]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
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<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.