C# 在两个Windows窗体之间切换

C# 在两个Windows窗体之间切换,c#,winforms,C#,Winforms,我正在开发一个在C#中使用Windows窗体的游戏。我希望能够使用第一个表单调用第二个表单。我有这个工作。然后我希望第二个表单将数据发送回第一个表单,而不是创建第一个表单的新实例。这能做到吗?我知道我需要设置我的属性,以便我可以设置从一种形式到另一种形式的变量。我只是不知道如何在不创建新实例的情况下调用第一个表单。 有没有办法做到这一点? 例如,如果我让表单A创建表单B的实例,我可以让表单B做一些工作并将数据发送回原始表单A而不创建表单A的新实例吗?如果不知道您的全部要求,很难说。但通常我会这样

我正在开发一个在C#中使用Windows窗体的游戏。我希望能够使用第一个表单调用第二个表单。我有这个工作。然后我希望第二个表单将数据发送回第一个表单,而不是创建第一个表单的新实例。这能做到吗?我知道我需要设置我的属性,以便我可以设置从一种形式到另一种形式的变量。我只是不知道如何在不创建新实例的情况下调用第一个表单。 有没有办法做到这一点?
例如,如果我让表单A创建表单B的实例,我可以让表单B做一些工作并将数据发送回原始表单A而不创建表单A的新实例吗?

如果不知道您的全部要求,很难说。但通常我会这样做(有点伪代码)

当然,这依赖于您的第二个表单是一个对话框。您需要在Form2上设置dialogresult按钮,并拥有一个公共属性,该属性将在对话框完成后从Form1访问


如果这不起作用,请告诉我,我会写一个不同的答案

如果您不立即使用发送回
表单A
的数据,那么您可以使用
表单U关闭
事件处理程序
表单B
,然后使用
表单B
中的公共属性

在您的
表格A中
可能如下所示:

public partial class FormA : Form
{
    FormB frmB = new FormB(); // Instantiate FormB so that you could create an event handler in the constructor
    public FormA()
    {
        InitializeComponent();
        // Event Handler for Form Closing
        frmB.FormClosing += new FormClosingEventHandler(frmB_FormClosing);

    }

    void frmB_FormClosing(object sender, FormClosingEventArgs e)
    {
        String fromFormB = frm2.FormBData; // Get Data from Form B when form is about to close
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frmB.ShowDialog(); // Showing Form B
    }
 }
  private void button1_Click(object sender, EventArgs e)
  {
       // Let just say that the data is sent back once you click a button
        FormBData = "Hello World!"; 
        Close();
   }

   public String FormBData { get; set; }
在你的
表格B
中,它可能是这样的:

public partial class FormA : Form
{
    FormB frmB = new FormB(); // Instantiate FormB so that you could create an event handler in the constructor
    public FormA()
    {
        InitializeComponent();
        // Event Handler for Form Closing
        frmB.FormClosing += new FormClosingEventHandler(frmB_FormClosing);

    }

    void frmB_FormClosing(object sender, FormClosingEventArgs e)
    {
        String fromFormB = frm2.FormBData; // Get Data from Form B when form is about to close
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frmB.ShowDialog(); // Showing Form B
    }
 }
  private void button1_Click(object sender, EventArgs e)
  {
       // Let just say that the data is sent back once you click a button
        FormBData = "Hello World!"; 
        Close();
   }

   public String FormBData { get; set; }

由于您是在
Form1
中创建Form2,因此您可以在
Form2
中创建自定义事件,并在创建
Form2
时在
Form1
中订阅,如果您在关闭时从
Form2
返回信息,则Edper或MindingData的答案将起作用

下面是一个使用

表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.myCustomEvent += frm2_myCustomEvent;
        frm2.Show();

    }

    void frm2_myCustomEvent(object sender, string e)
    {
        this.Text = e;
    }
}
表格2

public partial class Form2 : Form
{
    public event EventHandler<string> myCustomEvent;
    int count;
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        count +=1;
        myCustomEvent(sender, count.ToString());
    }
}
公共部分类表单2:表单
{
公共事件处理程序myCustomEvent;
整数计数;
公共表格2()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
计数+=1;
myCustomEvent(发送方,count.ToString());
}
}

在构建表单a时,如何将表单a的引用传递到表单B中?在表格B上有一个包含表格a引用的私有字段,然后从那里开始;只需在表单B中保存对表单a的引用。但更好的方法是使用事件。为要在第二个表单中发回的数据设置一个变量。然后创建一个返回该变量的方法,然后从第一个表单调用它。@Fendorio:这难道不意味着表单a必须不断轮询表单B以获取更新吗?不确定这是否理想。@Aaron当您将数据发送回表格a时,我有一个问题,您是立即使用它,还是在表格B关闭后使用发送回数据?谢谢您的反馈。我做了一些类似的事情,但有代表性。这样,当表单B关闭时,我显示隐藏的表单a,并从第二个表单返回到第一个表单,以便在主表单中使用它。再次感谢您的投入和时间回答我的问题。很高兴您找到了一种方法。谢谢你接受我的回答。祝你快乐,愿上帝保佑。