Использование элемента управления, созданного в Form_Load в другом событии

#c# #scope

#c# #область видимости

Вопрос:

У меня есть два элемента управления, созданных на Form_Load , кнопка и поле со списком. У меня также есть событие для кнопки, но событие должно иметь возможность видеть только что созданный combobox. Когда я пытаюсь вызвать combobox по его имени, он говорит, что он не существует в этом контексте.

 private void Form1_Load(object sender, EventArgs e)
{
    Button przycisk = new Button(); 
    przycisk.Name = "przycisk";
    przycisk.Dock = DockStyle.Bottom;
    przycisk.Text = "Wybierz";

    ComboBox kombo = new ComboBox(); 
    kombo.Name = "kombo";
    kombo.Dock = DockStyle.Bottom;
    kombo.Items.Add("Przycisk");   
    kombo.Items.Add("Etykeita");
    kombo.Items.Add("Pole tekstowe");

    Controls.Add(kombo);  
    Controls.Add(przycisk);

    przycisk.Click  = new EventHandler(przycisk_Click); 
}

private void przycisk_Click(object sender, EventArgs e)
{
    kombo.Items.Add("Panel");  //just an example 
}
  

Есть ли способ заставить это работать?

Ответ №1:

Только элементы управления, которые используются в разметке с runat =»server», будут переменными класса на вашей странице. На самом деле они определены в файле конструктора.

Что вы захотите сделать, так это добавить в класс что-то вроде следующего, где у вас есть переменная класса, затем назначить kombo в вашей функции загрузки страницы. Затем он будет существовать в вашем обработчике событий click.

  // kombo is now scoped for use throughout this class
 ComboBox kombo = null;

 private void Form1_Load(object sender, EventArgs e)
    {
        Button przycisk = new Button(); 
        przycisk.Name = "przycisk";
        przycisk.Dock = DockStyle.Bottom;
        przycisk.Text = "Wybierz";

        // Assign to our kombo instance
        kombo = new ComboBox(); 
        kombo.Name = "kombo";
        kombo.Dock = DockStyle.Bottom;
        kombo.Items.Add("Przycisk");   
        kombo.Items.Add("Etykeita");
        kombo.Items.Add("Pole tekstowe");

        Controls.Add(kombo);  
        Controls.Add(przycisk);

        przycisk.Click  = new EventHandler(przycisk_Click); 

    }

    private void przycisk_Click(object sender, EventArgs e)
    {
        // Using the kombo we created in form load, which is still referenced
        // in the class
        kombo.Items.Add("Panel");  //just an example 
    }
  

Ответ №2:

Вам придется использовать метод FindControl(), чтобы сначала найти объект.

 private void przycisk_Click(object sender, EventArgs e)
{
   ComboBox kombo = (ComboBox)FindControl("kombo");
   kombo.Items.Add("Panel");
}