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

我试图动态创建控件并在运行时给它们属性。

我把我的代码放在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:对象引用未设置为对象的实例。] _Default.Page_PreInit(Object sender,EventArgs e)位于c:\ Users \ bilalq \ Documents \ Visual Studio 2010 \ WebSites \ WebSite3 \ Default.aspx.cs:31 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,EventArgs e)+35 System.Web.UI.Page。 OnPreInit(EventArgs e)+8876158 System.Web.UI.Page.PerformPreInit()+31 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+328

我建议您在page_int之外声明控件并在init中进行初始化,然后使用它们的名称而不是find控件。

由于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是null并且当您尝试打印其Text时它会崩溃。

作为一般规则,只需检查null以及将FindControl的结果转换为其他内容时的类型。

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 =...; } 
  protected override void OnLoad(EventArgs e) { base.OnLoad(e); //-- Create your controls here }