#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");
}