Передача параметров вперед и назад между формами в C # - PullRequest
4 голосов
/ 15 января 2011

Я создаю приложение, в котором пользователь нажимает кнопку на форме1, что приводит к отображению формы2. Затем пользователь заполняет чат в форме 2 и затем нажимает кнопку, которая закрывает форму 2 и отправляет параметры в форму 1 для обработки. Как я могу сделать это в C #? Я видел людей, использующих свойства, чтобы сделать это, но примеры не достаточно ясны. Может кто-нибудь привести пример кода, показывающего мне, как я могу передать параметры? Я бы предпочел метод свойств, но пока он работает, я буду считать его ответом.

Ответы [ 2 ]

10 голосов
/ 15 января 2011

Проще говоря, поместите элементы формы во вторую форму, как обычно.Затем вы можете добавить общедоступные средства доступа к этой форме, которые затем можно будет извлечь и сослаться на них.Например, если в Form2 есть текстовые поля, которые вы хотите получить обратно, вы можете:

class Form2
{
  // Form2.designer.cs
  private TextBox TextBox1;

  // Form2.cs
  public String TextBoxValue // retrieving a value from
  {
    get
    {
      return this.TextBox1.Text;
    }
  }

  public Form2(String InitialTextBoxValue) // passing value to
  {
    IntiializeComponent();

    this.TextBox1.Text = InitialTextBoxValue;
  }
}

Затем просто получить к нему доступ позже, когда создадите форму (так же, как OpenFileDialog для Filename и т. Д.

public void Button1_Click(object sender, EventArgs e)
{
  Form2 form2 = new Form2("Bob");      // Start with "Bob"
  form2.ShowDialog();                  // Dialog opens and user enters "John" and closes it
  MessageBox.Show(form2.TextBoxValue); // now the value is "John"
}

То же самое можно сделать для Int32, Boolean и т. Д. Просто зависит от значения формы, если вы хотите ее разыграть / проверить или иным образом.

Альтернативно, вы можете игратьсо свойством Modifiers в конструкторе форм, где вы можете сделать элемент управления общедоступным, чтобы он был доступен извне. Я лично рекомендую использовать метод доступа, чтобы вы могли проверять и подтверждать возвращаемые результаты, а не просто выводить значение (как правило, эта логика найденав самой форме, не во всех случаях, когда вы хотите вызвать / использовать Form2)

4 голосов
/ 06 октября 2013

Вот как мне нравится передавать параметры в другую форму и обратно:

При условии следующего дизайна формы для Form1 и Form2:

Form1 and Form2

В этом примере текстовое поле 'txtBoxForm1' в Form1 передается в Form2, где оно используется для инициализации текстового поля 'txtBoxForm2' в Form2. После того как пользователь взаимодействует с Form2 и завершает ее, нажимая кнопку [Возврат к Form1], значение текстового поля 'txtBoxForm2' присваивается параметру, который возвращается (по ссылке) в текстовое поле 'txtBoxForm1' в Form1.

Кодирование выполняется в два простых шага:

Шаг 1) В Form1 передать параметр (ы) в Form2, перегрузив метод ShowDialog ():

 public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();

        //Step 1) 
        //Display the form passing parameter(s) via overloading 
        //the ShowDialog() method. 
        //In this example the parameter is the 'txtBoxForm1' on Form1.
        // f2.ShowDialog(); is replaced by
        f2.ShowDialog(ref txtBoxForm1); 

    }
}

В приведенном выше коде параметром является само текстовое поле 'txtBoxForm1', которое передается по ссылке. Передача по ссылке является причиной того, что он не только передает значение текстового поля в Form2, но также может получать и отображать в Form1 любые изменения, примененные к этому параметру текстового поля при выполнении Form2.

Я поместил весь класс Form1, чтобы показать, что в этом классе нет ничего особенного, кроме перегрузки вызова метода f2.ShowDialog ().

Шаг 2) Получение и возврат параметра (ов) с помощью перегруженного метода ShowDialog ():

public partial class Form2 : Form
{

    public Form2()
    {
        InitializeComponent();
    }

    private void btnReturn_Click(object sender, EventArgs e)
    {
        this.Close(); 
    }

    //Step 2)
    //Receiving and returning parameter(s) via the overloaded ShowDialog() method.
    //This saves the need to have Properties and or fields associated
    //to parameters when overloading the above Form() constructor instead.
    public void ShowDialog(ref TextBox txtBoxForm1)
    {
        //Assign received parameter(s) to local context
        txtBoxForm2.Text = txtBoxForm1.Text;

        this.ShowDialog(); //Display and activate this form (Form2)

        //Return parameter(s)
        txtBoxForm1.Text = txtBoxForm2.Text;
    }
}

Снова я предоставил полный код класса формы (в данном случае Form2), чтобы показать, насколько ограничено вмешательство в кодирование. Никаких дополнительных полей или свойств здесь не требуется. Это потому, что я использовал здесь инструкцию ShowDialog (), а не конструктор Form2 () из Form1 для передачи параметра. В отличие от конструктора Form2 (), метод ShowDialog () является оболочкой фазы взаимодействия пользователя с Form2. Таким образом, его синхронизация позволяет параметру '(ref txtBoxForm1)' быть полным и достаточным представителем параметра, который мы хотим отправить и получить.

Перегрузка метода путем его повторного объявления с другим набором параметров (также называемых сигнатурой) - мощная особенность C # .net. В этом случае здесь, с одной стороны, это позволяет добавить параметр (ы) к вызову метода ShowDialog (), а с другой стороны, перегруженный метод ничего не теряет из исходной версии этого же метода, поскольку исходная версия метод платформы ShowDialog () .net также выполняется с помощью this.ShowDialog (); инструкция.

На данный момент это все для меня.

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

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