Динамически созданные элементы управления, вызывая нулевую ссылку

StackOverflow https://stackoverflow.com/questions/7306305

  •  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
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top