Передайте данные между 2 уже открытыми winforms (C#) - PullRequest
0 голосов
/ 30 апреля 2020

Я действительно прочитал множество постов по этой проблеме, однако я вижу среди них небольшие различия, которые действительно усложняют мою жизнь. Моя ситуация такова: у меня открыто 2 winforms (Form1 - Form2). Ни Form1, ни Form 2 не создаются друг от друга. То есть я не нажимаю кнопку, чтобы показать форму 1 или форму 2. Фактически, Форма 1 открыта, а Форма 2 создается с помощью третьей формы, а третья форма затем закрывается. По сути, мы остались с Form1 и Form2.
Я хочу перенести данные из текстовых полей в Form2 в Form 1 после нажатия кнопки в Form2, которая затем закрывает Form2 ...., пока Form2 остается открытой. Пока что варианты, которые я вижу, включают создание новой формы Form1, а затем передачу данных в ее конструктор et c или создание Form2 через ShowDialog. Но это не тот случай, здесь.

Буду признателен за ваши идеи по этому поводу.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2020

Спасибо большое. Я пошел с подходом делегата-случая, и это работало.

0 голосов
/ 30 апреля 2020

Вы можете использовать события для передачи сообщений отключенным объектам. Вы можете прослушивать события в Form1 и вызывать их из Form2. Это из памяти, не ожидайте, что он скомпилируется.

Создайте класс, который является «концентратором событий».

public static class EventHub
{
    public static event EventHandler<EventArgs> formMessageHandler;

    public static void OnFormMessage(object sender, EventArgs e)
    {
        formMessageHandler?.Invoke(sender, e);
    }
}

В событии щелчка кнопки Form2 вызвать событие. Вы можете использовать ссылку отправителя непосредственно для доступа к публикуемым c членам или вы можете поместить соответствующие данные в EventArgs.

EventHub.OnFormMessage(this, EventArgs.Empty);

В Form1, возможно в конструкторе, подключить слушателя:

EventHub.formMessageHandler += some_method_you_write;

Теперь, когда вы нажмете кнопку в Form2, Form1 получит ссылку на Form2 в some_method_you_write () . Или вы можете использовать EventArgs для передачи данных, поэтому вам не нужно создавать какие-либо публичные c элементы управления в Form2.

0 голосов
/ 30 апреля 2020

имеют свойство publi c stati c с параметром publi c get и private setter в вашем классе Form1

public static Form1 Instance { get; private set; }

в конструкторе Form1 присваивают this указанному свойству

Instance = this;

в вашем классе Form1 добавьте метод publi c для приема данных, переданных Form2

public void accept(object somePassedData)
{
  //do what ever you want with the passed data in Form1
}

в Form2, в ваш обработчик закрытия передайте данные в Form1

Form1.Instance.accept(...);
0 голосов
/ 30 апреля 2020

Например, в вашей форме Form1 вы объявляете переменную, подобную этой.

          public Form2 frm2;

И когда вы создаете экземпляр Form1 из формы Form2:

         Form1 frm1 = new Form1();
         frm1.frm2 = this;

Вот так в вашем frm1 вы можете получить доступ к элементам управления Form2, например:

        this.txtForm1sTextBox.Text = this.frm2.Form2sTextBox.Text;



        Or you can get parameters via a public method of Form2. In your Form2 :



        public string GetMyParametersOrObject()
        {

           return Form2sTextBox.Text;

        }

В вашем frm1:

       var text = this.frm2.GetMyParametersOrObject();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...