动态创建的控件导致Null引用
本文关键字:Null 引用 控件 创建 动态 | 更新日期: 2023-09-27 18:07:40
我正在尝试动态创建控件并在运行时赋予它们属性。
我已经把我的代码在Page_Init事件,当我运行我的网站,我可以看到我的控件,但当我点击提交按钮的错误发生说"对象引用不设置为对象的实例"。
下面是我使用的代码: //Creates instances of the Control
Label FeedbackLabel = new Label();
TextBox InputTextBox = new TextBox();
Button SubmitButton = new Button();
// Assign the control properties
FeedbackLabel.ID = "FeedbackLabel";
FeedbackLabel.Text = "Please type your name: ";
SubmitButton.ID = "SubmitButton";
SubmitButton.Text = "Submit";
InputTextBox.ID = "InputTextBox";
// Create event handlers
SubmitButton.Click += new System.EventHandler(SubmitButton_Click);
// Add the controls to a Panel
Panel1.Controls.Add(FeedbackLabel);
Panel1.Controls.Add(InputTextBox);
Panel1.Controls.Add(SubmitButton);
}
protected void SubmitButton_Click(object sender, EventArgs e)
{
// Create an instance of Button for the existing control
Button SubmitButton = (Button)sender;
// Update the text on the Button
SubmitButton.Text = "Submit again!";
// Create the Label and TextBox controls
Label FeedbackLabel = (Label)FindControl("FeedbackLabel");
TextBox InputTextBox = (TextBox)FindControl("InputTextBox");
// Update the controls
FeedbackLabel.Text = string.Format("Hi, {0}", InputTextBox.Text);
如何修复这个错误?
这是堆栈跟踪
[NullReferenceException: Object reference未设置为对象的实例。]_Default。Page_PreInit(Object sender, EventArgs e) in c:'Users'bilalq'Documents'Visual Studio 2010'WebSites'WebSite3'Default.aspx.cs:31System.Web.Util.CalliHelper。EventArgFunctionCaller(IntPtr fp, Object 0, Object t, EventArgs e) +14System.Web.Util.CalliEventHandlerDelegateProxy。回调(对象发送者,EventArgs e) +35System.Web.UI.Page。OnPreInit(EventArgs e) +8876158System.Web.UI.Page.PerformPreInit () + 31System.Web.UI.Page。ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +328
由于FindControl不是递归的,您必须替换以下代码:
Label FeedbackLabel = (Label)FindControl("FeedbackLabel");
TextBox InputTextBox = (TextBox)FindControl("InputTextBox");
:
Label FeedbackLabel = (Label)Panel1.FindControl("FeedbackLabel");
TextBox InputTextBox = (TextBox)Panel1.FindControl("InputTextBox");
然而,根据其他答案,您应该将声明(而不是实例化)移到方法外部(在类级别),以便轻松地为您的控件获取条目。
尝试将您的代码放在Page_Load而不是Page_Init中,并且在使用FindControl返回的对象之前检查是否为null。
我怀疑对象InputTextBox
是空的,当你试图打印它的Text
时它崩溃了。
作为一般规则,当将FindControl的结果转换为其他东西时,只检查null和type。
FindControl
失败,因为它找不到控件并导致空引用。
直接使用FeedbackLabel
引用它,因为你已经在你的类中有它了。只需将作用域移到'Init'方法之外即可。
private Label feedbackLabel = new Label();
private TextBox inputTextBox = new TextBox();
private Button submitButton = new Button();
public void Page_Init(EventArgs e)
{
feedbackLabel.ID = "FeedbackLabel";
}
protected void SubmitButton_Click(object sender, EventArgs e)
{
feedbackLabel.Text =...;
}
我建议你在page_int之外声明你的控件,并在init中进行初始化,然后使用它们的名称而不是查找控件
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//-- Create your controls here
}