[英]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.