Динамически созданные элементы управления, вызывая нулевую ссылку
-
25-10-2019 - |
Вопрос
Я пытаюсь динамически создать элементы управления и дать им свойства во время выполнения.
Я поместил свой код в событие 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 (отправитель объекта, Eventargs e) в C: users bilalq documents visual Studio 2010 Webites webse3 default.aspx.cs: 31 System.web.util.callihelper.eventargFunctionCaller (Intptr FP, Object O, Object T, EventArgs E) +14 System.Web.Util.callieveNathandlerDelegateProxy.callback (отправитель объекта, Eventargs e) +35 System.Web.UI.PAGE. OnPreinit (EventArgs e) +8876158 System.Web.UI.PAGE.PerformPreinit () +31 System.Web.UI.PAGE.POCESSREQUESTMAIN (BOOLEAN включил в
Решение
Я предлагаю вам объявить свои элементы управления вне Page_int и выполнить свою инициализацию в инициировании, а затем используйте их с их именем вместо контроля.
Другие советы
Поскольку 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, а также проверьте NULL перед использованием объектов, возвращаемых FindControl.
Я подозреваю объект InputTextBox
NULL, и он вылетает, когда вы пытаетесь распечатать его Text
.
Как правило, просто проверьте NULL, а также на тип при отработке результатов FindControl к чему -то другому.
А FindControl
терпит неудачу, потому что он не может найти контроль и вызывая нулевую ссылку.
Просто ссылайся на него напрямую, используя FeedbackLabel
Как у вас уже есть в своем классе. Просто переместите область прицела за пределы вашего метода «Инициации».
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
}