Передача данных обратно в первую форму из второй формы в C # - PullRequest
6 голосов
/ 22 марта 2011

У меня есть две формы. Скажите Форма A , Форма B .

Из FormA я позвонил в FormB, используя frmB.Show ();

В FormB у меня есть два текстовых поля и элементы управления списком. Предположим, что пользователь вводит некоторые данные в эти два текстовых поля, выбирает элемент из выпадающего списка в Form2 и нажимает кнопку OK .

После нажатия кнопки «Я хочу, чтобы введенные пользователем значения в этих текстовых полях», значение выделенного элемента в выпадающем списке вернулось к Форма A .

Как мне добиться этого с помощью C #.

Ответы [ 9 ]

6 голосов
/ 09 ноября 2012

Я подошел к простому пути .. маленькие украшения ..

  1. создать открытые переменные в классе формы, т.е.

    публичная строка passVariable1 = "";

  2. если у вас есть текстовые поля, перейдите в свойства, затем щелкните молнию и дважды щелкните пустой обработчик событий TextChanged. Это создаст фрагмент кода в начале кода, который будет выполнен, когда содержимое текстового поля изменилось .. в этом блоке кода назначьте содержимое текстового поля вашей соответствующей общедоступной переменной.

  3. т.е. моя публичная переменная была

    public string issue = "";

    private void txtIssue_TextChanged (отправитель объекта, EventArgs e) { issue = txtIssue.Text; }

  4. Добавьте кнопку и создайте событие нажатия для этой кнопки (просто дважды щелкните кнопку на панели дизайна). В блоке кода события щелчка установите для результата dilog значение ok и скройте

    this.DialogResult = DialogResult.OK;

    this.Hide (); * +1032 *

  5. В коде родительского окна проверьте результат диалога и извлеките данные формы из открытых переменных дочерней формы

if (f.ShowDialog() == DialogResult.OK)
  {
      string b  = f.issue;             
      string e = f.year;
      string f = f.month;
  };
5 голосов
/ 22 марта 2011

В сценарии, который вы описываете, я бы назвал frmB.ShowDialog(), а не frmB.Show().

// Inside FormA open frmB as a modal dialog waiting for 
// OK or Cancel result using the following  statement

if (frmB.ShowDialog() == DialogResult.OK)
{
   // Retrieve selected values from frmB here (while frmB is still not disposed)
}

Преимущества ShowDialog() в том, что вы:

  1. Получить возвращаемое значение из формы легко, позволяя вам определить, что кнопка OK (а не отмена) была нажата, чтобы закрыть его.
  2. Форма закрывается не сразу после закрытия, что позволяет вам получить нужные значения.
  3. Открывая frmB как модальное диалоговое окно, вы избегаете необходимости проверять сложности, которые могут возникнуть, если ваш пользователь начинает взаимодействовать с formA, когда открыт frmB.

ПРИМЕЧАНИЕ. При проектировании frmB необходимо установить для свойства DialogResult элемента управления кнопки OK значение DialogResult.OK, чтобы форма возвращала правильный DialogResult при нажатии этой кнопки (в качестве альтернативы можно также установить this.DialogResult в обработчике события Click кнопки OK)

4 голосов
/ 23 марта 2011

Вы можете создать EventHandler в FormB, на который FormA будет подписываться. Кроме того, добавьте несколько открытых свойств в FormB, которые представляют те данные, которые вы хотите, чтобы FormA могла использовать. Затем, когда FormB инициирует событие, FormA будет знать, как обновить свои данные.

Примечание. Ключевым принципом в этом примере является реализация EventHandler (вы можете создать свой собственный тип обработчика событий), который уведомляет FormA, когда данные готовы для обновления / просмотра / и т. Д. Надеемся, этот пример позволит вам увидеть, как вы можете реализовать обработчик событий для вашей конкретной ситуации.

Пример:

Форма А -

public partial class FormA : Form
{
    //FormA has a private instance of FormB
    private FormB formB = null;
    public FormA()
    {
        InitializeComponent();
    }

    void formB_OnDataAvailable(object sender, EventArgs e)
    {
        //Event handler for when FormB fires off the event
        this.label1.Text = string.Format("Text1: {0}\r\nText2: {1}", 
            formB.Text1, formB.Text2);
    }

    private void InitializeFormB()
    {
        this.formB = new FormB();

        //FormA subscribes to FormB's event
        formB.OnDataAvailable += new EventHandler(formB_OnDataAvailable);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.InitializeFormB();
        formB.Show();
    }
}

Форма B -

public partial class FormB : Form
{
    //Event that fires when data is available
    public event EventHandler OnDataAvailable;

    //Properties that expose FormB's data
    public string Text1 { get; private set; }
    public string Text2 { get; private set; }

    public FormB()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Set the exposed properties, then fire off the event.
        this.Text1 = this.textBox1.Text;
        this.Text2 = this.textBox2.Text;

        if (OnDataAvailable != null)
            OnDataAvailable(this, EventArgs.Empty);
    }
}
3 голосов
/ 22 марта 2011

Или вы можете передать объект из FormA в FormB и привязать его свойства к элементам управления в FormB.Если вы хотите, чтобы FormA получала уведомление, когда вы нажимаете кнопку OK, вы можете объявить событие в своем классе контейнера данных, подписаться на него в FormA и запустить его из FormB.1004 *

в FormA:

    private void button4_Click(object sender, EventArgs e)
{
    DataContainer data = new DataContainer();
    data.Text1 = "text1";
    data.Text1 = "text2";

    Form2 frm = new Form2();
    frm.Data = new DataContainer();
    data.AcceptedChanges += new EventHandler(data_AcceptedChanges);
    frm.Show();
}

void data_AcceptedChanges(object sender, EventArgs e)
{
    // your code here
}

и в FormB:

public DataContainer Data { get; set; }

private void Form2_Load(object sender, EventArgs e)
{
    textBox1.DataBindings.Add(new Binding("Text", Data, "Text1"));
    textBox2.DataBindings.Add(new Binding("Text", Data, "Text2"));
}

private void button1_Click(object sender, EventArgs e)
{
    Data.AcceptChanges();
}

Вы также должны реализовать INotifyPropertyChanging и INotifyPropertyChanged в классе DataContainer, чтобы хорошо играть с привязками.

2 голосов
/ 22 марта 2011

Как насчет использования событий и делегатов? Посмотреть это http://colinmackay.scot/2005/04/22/passing-values-between-forms-in-net/

1 голос
/ 07 сентября 2017

У меня возникла та же проблема, и у меня возникла идея, которая немного отличается.В моем сценарии я делаю программу с карточками для моих младших двоих детей, и я хотел иметь возможность перенести ответ, предоставленный в родительскую форму (новую дочернюю форму для каждого нового вопроса с карточкой, чтобы родительская форма могла обновлять, сколькоосталось, сколько правильно, сколько неверно и т. д.) без необходимости добавлять значения в базу данных.Кажется, излишним для чего-то, что должно быть просто.То, что я сделал, было создать класс с 3 каждого типа переменной.Я полагал, что для каждого задания достаточно трех типов.

Это пример моего нового класса:

namespace ClassNamespace
{
  public class ValueHolder
  {
    public int intValue1 { get; set; }
    public int intValue2 { get; set; }
    public int intValue3 { get; set; }
    public long longValue1 { get; set; }
    .
    .
    .
  }
}

Я создаю новый ValueHolder (ValueHolder vh;) из родительской формыи передать его в дочернюю форму.В дочерней форме я создаю новый ValueHolder, а затем устанавливаю его равным объекту ValueHolder, отправленному в конструкторе класса дочерней формы.Теперь, когда нажата клавиша ввода (дан ответ), я могу установить vh.intValue1 равным this.answerBox.text; ... ну, мне нужно использовать int.tryparse ();Но ты получил идею.Затем мне нужно только сослаться на vh.intValue1 из родительской формы, чтобы получить введенное значение.

Родительская форма:

for (int i = 0; i < limit; i++)
{
  ValueHolder vh = new ValueHolder();

  ChildClass cc = new ChildClass(vh);
  MessageBox.Show(vh.intValue1.ToString()); //to test that it works
}

и дочерняя форма:

ValueHolder vh;

public ChildClass (ValueHolder vhIncoming)
{
  vh = vhIncoming;
}

private void answerBox_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    vh.intValue1 = 1234;
  }
}

Это, кажется, самое простое решение для моего сценария.Я знаю, что этот вопрос старый, но хотел добавить эту опцию для всех, кто находится в аналогичной должности.Просто добавьте класс в свой проект, добавьте больше типов или больше типов в класс по мере необходимости, повторите промывку для будущих проектов.

1 голос
/ 22 марта 2011

Грязное, но и самое быстрое решение - сделать эти элементы управления общедоступными. Это можно сделать, добавив слово public в файл Form2.Decisgner.cs. Если FormA имеет переменную-член или локальную переменную FormB, вы можете получить доступ к элементу управления (скажем, TextBox1) с помощью:

frmB.TextBox1.Text

, который теперь доступен и вне FormB.

0 голосов
/ 22 марта 2011

Это будет зависеть от того, как вы обычно разрабатываете свои приложения.

  • Вы можете работать, используя событие управляемая система, где вы будете создавать События и делегаты. Упоминается @ Dave81
  • Или вы можете создать свойства, которые вернуть заданные / выбранные значения так что родитель может получить их от объекта (хотел сказать диалог но не уверен, что вы используете).
  • Или вы можете подписаться на @zmilojko и просто установить их публично, что в основном так же, как создание свойств, но больше к темной стороне кодирования практики: D

Все это будет работать, но все зависит от того, как вы хотите, чтобы ваши приложения были структурированы.

0 голосов
/ 22 марта 2011

Если он находится на той же странице, вы должны иметь возможность читать его непосредственно из ваших элементов управления как Textbox1.Text, Textbox2.Text, Combobox.SelectedValue (я думаю) Но если он на разных страницах, используйте переменные Session, такие как: Session ["date1 "] = TextBox1.Text;Session ["date2"] = TextBox2.Text;Session ["comboValue"] = Combobox.SelectedValue;и используйте их для заполнения вашей формы

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