2011-01-15 2 views
3

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

ответ

10

Проще говоря, поместите свои элементы формы во вторую форму, как обычно. Затем вы можете добавить публичных аксессуаров к этой форме, которые вы можете извлечь из ссылки и ссылки. Например, если 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 делает для Имя файла и т.д.

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, и т.д. Все зависит от величины формы, а если вы хотите, чтобы бросить/проверить его, или в противном случае.

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

+0

Спасибо, также есть ли способ передать параметры form2 из формы1? Тот же код создаст вторую форму1, верно? –

+0

Вы можете воспользоваться конструкцией в Form2 для предоставления параметров или использовать другие свойства, которые вы установили перед вызовом ShowDialog (но вам нужно будет внести какие-либо изменения в элементы управления после 'InitializeComponent()' если эти proeprties фактически влияют на способ отображения формы). –

+0

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

4

Здесь как я хотел бы передать параметр (ы), чтобы и обратно из другого вида:

При условии, следующий вид конструкции для Form1 и Form2:

Form1 and Form2

в этом примере «txtBoxForm1» текстовое поле на Form1 передается в Form2, где он используется для инициализации текстового поля txtBoxForm2. Form2. После того, как пользователь взаимодействует с Form2 и заканчивает его, нажав кнопку [Return to 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(), а с другой стороны перегруженный метод ничего не теряет из исходной версии этого же метода, поскольку исходная версия метод Framework ShowDialog() .net выполняется также через 'this.ShowDialog();' инструкция.

Это для меня об этом сейчас.

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

+0

Идеальное решение для обработки ссылок –

Смежные вопросы