Вызов кнопки из другой формы в С#

Вопрос: Я пытаюсь вызвать кнопку из другой формы, чем она была создана. У меня есть приложение с двумя формами: Главный второй "Вторая" форма вызывается из "Основной" формы с кодом: Second run_second_form = new Second(); run_second_form.Show(); В "Основной" форме у меня есть кнопка "Button1". Возможно ли, чтобы эта кнопка была вызвана из "второй" формы? Я могу

Вопрос:

Я пытаюсь вызвать кнопку из другой формы, чем она была создана. У меня есть приложение с двумя формами:

  • Главный
  • второй

“Вторая” форма вызывается из “Основной” формы с кодом:

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

Оцените статью
Добавить комментарий