动态创建的控件导致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

动态创建的控件导致Null引用

由于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
    }