将数据从C#中的第二个表单传回第一个表单

ven*_*kat 7 c# c#-4.0

我有两个表格.说FormA,FormB.

从FormA我使用frmB.Show()调用FormB ;

在FormB中,我有两个文本框和一个组合框控件.假设用户在这两个文本框中输入一些数据,并从Form2中的组合框中选择一个项目,然后单击确定按钮.

点击后我想要那些文本框用户输入的值,组合框选择项目值返回到FormA.

我如何使用C#实现这一目标.

小智 6

我接近简单的方式..点缀小装饰..

  1. 在表单类中创建公共变量即

    public string passVariable1 ="";

  2. 如果您有文本框转到属性,然后单击闪电并双击空TextChanged事件处理程序.这将在代码中创建一个代码片段,当文本框的内容发生变化时执行该代码片段.在此代码块中,将文本框的内容分配给相应的公共变量.

  3. 即我的公共变量是

    public string issue ="";

    private void txtIssue_TextChanged(object sender,EventArgs e){issue = txtIssue.Text; }

  4. 添加一个按钮并为此按钮创建一个单击事件(只需双击设计窗格中的按钮).在点击事件代码块中,将dilog结果设置为ok并隐藏

    this.DialogResult = DialogResult.OK;

    this.Hide();

  5. 在父窗口代码中检查对话框结果,并从子窗体的公共变量中获取窗体数据

if (f.ShowDialog() == DialogResult.OK)
  {
      string b  = f.issue;             
      string e = f.year;
      string f = f.month;
  };
Run Code Online (Sandbox Code Playgroud)


Sim*_*n S 5

在您描述的情况下,我可能会打电话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)
}
Run Code Online (Sandbox Code Playgroud)

的好处ShowDialog()是您:

  1. 从表单轻松获取返回值,使您可以确定单击了OK(而不是取消)以将其关闭。
  2. 窗体在关闭时不会立即处理,因此允许您检索所需的值。
  3. 通过将frmB作为模式对话框打开,您不必检查是否在打开frmB时用户开始与formA交互可能会发生的复杂性。

注意:在设计frmB时,必须将DialogResult“确定”按钮控件的属性设置为DialogResult.OK,以便在按下此按钮时表单返回正确的DialogResult(或者也可以this.DialogResult在“确定”按钮的Click事件处理程序中进行设置)


cde*_*del 4

或者,您可以将一个对象从 FormA 传递到 FormB 并将其属性绑定到 FormB 中的控件。如果您希望在单击“确定”按钮时通知 FormA,您可以在数据容器类中声明一个事件,在 FormA 中订阅该事件并从 FormB 触发该事件。

是 DataContainer 您定义的某个类

public class DataContainer
{
    public event EventHandler AcceptedChanges;
    protected virtual void OnAcceptedChanges()
    {
        if ((this.AcceptedChanges != null))
        {
            this.AcceptedChanges(this, EventArgs.Empty);
        }
    }

    public void AcceptChanges()
    {
        this.OnAcceptedChanges();
    }

    public string Text1 { get; set; }
    public string Text2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在表格A中:

    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
}
Run Code Online (Sandbox Code Playgroud)

并在表格 B 中:

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();
}
Run Code Online (Sandbox Code Playgroud)

您还应该在 DataContainer 类上实现 INotifyPropertyChanging 和 INotifyPropertyChanged 以很好地使用绑定。