Вопрос:
Я пытаюсь вызвать кнопку из другой формы, чем она была создана. У меня есть приложение с двумя формами:
- Главный
- второй
“Вторая” форма вызывается из “Основной” формы с кодом:
Second run_second_form = new Second(); run_second_form.Show();
В “Основной” форме у меня есть кнопка “Button1”. Возможно ли, чтобы эта кнопка была вызвана из “второй” формы?
Я могу легко вызвать “Button1” из “Основной” формы, где она создана, с кодом:
Button1.PerformClick();
но я не могу это сделать из “второй” формы. Я попробовал:
Main.Button1.PerformClick();
но он говорит: “Имя” Button1 “не существует в текущем контексте”.
Лучший ответ:
Итак, во-первых, элементы управления, добавленные в формы с использованием конструктора, добавляются как “Частные”. Чтобы элемент управления был доступен за пределами Main вам необходимо изменить доступность.
Измените его из “Частного” на “Внутренний” (предпочтительно, если две формы находятся в одной сборке) или “Публикация”, если они не являются.
Затем вы должны иметь доступ к Button1 в основной форме.
Единственное, что вы не показываете, – это то, как вы держите ссылку на Main чтобы иметь возможность вызывать Main.Button1.PerformClick().
После изменения доступности в дизайнере, здесь код, который я использовал для проверки этого:
public partial class Second : Form { public Second() { InitializeComponent(); } internal Main Main { get; set; } private void button1_Click(object sender, EventArgs e) { if (this.Main != null) { this.Main.Button1.PerformClick(); } } } public partial class Main : Form { public Main() { InitializeComponent(); } private void Main_Load(object sender, EventArgs e) { Second run_second_form = new Second(); run_second_form.Main = this; run_second_form.Show(); } private void Button1_Click(object sender, EventArgs e) { MessageBox.Show(«Clicked on Main»); } }
Это сработало для меня.
Сказав все это, я думаю, что решение Ctznkane525, вероятно, лучше для того, что вам нужно. Как правило, лучше избегать передачи ссылок на формы, подобные этому. Main должен просто реагировать на событие со Second.
Ответ №1
Button1 не отображается другой формой, так как модификатор не является общедоступным или внутренним, но это не так, как вы хотите это делать.
У меня была бы вторая форма пожара событие, и у первой формы есть обработчик события для экземпляра второй формы.
Таким образом, между двумя формами не создается двунаправленная зависимость.
Вот пример:
Класс события:
public class ActionToCallEvent : EventArgs { private ActionToCallEvent() {} }
В форме 2:
public static event EventHandler<ActionToCallEvent> ActionToCall; private static void OnActionToCall(EventArgs e) { if (ActionToCall != null) ActionToCall(this, e); }
Вы будете называть OnActionToCall в Form2, когда вам нужно использовать метод из 1.
В Форме 1 при создании экземпляра Form2:
Form2 form2 = new Form2(); form2.ActionToCall += Form2EventHandler;
И это метод в Form1 для захвата обработки событий:
private void Form2EventHandler(object sender, ActionToCallEvent e) { // Call Your Code Here! } Ответ №2
Ну, во-первых, вы, вероятно, хотите переместить логику из события нажатия кнопки в свой собственный метод. Во-вторых, вам просто нужно передать ссылку из основной формы во вторую форму.
На этом есть несколько вариантов.
Second run_second_form = new Second(); run_second_form.Show(this); //Makes the main form the owner of second_form
Затем в вашей второй форме
Mainform mainForm = (MainForm)this.Owner; mainform.Button1.PreformClick