Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在表单之间切换并正确发送变量_C#_Forms - Fatal编程技术网

C# 在表单之间切换并正确发送变量

C# 在表单之间切换并正确发送变量,c#,forms,C#,Forms,我想知道如何通过按钮点击事件在表单之间正确切换 我有表格1和表格2。 表格1有:-文本框表格1 -按钮窗体1 表格2有:-文本框表格2 -按钮窗体2 我想点击按钮Form1事件转到Form2。然后我想将一些消息写入TextBoxForm2,然后按按钮Form2,它将再次转到Form1,来自TextBoxForm2的消息将显示在TextBoxForm1中 一切正常,但我有一个问题。当我关闭应用程序并希望调试并再次启动它时,会出现一些错误,如:“应用程序已在运行” 表格1: public stati

我想知道如何通过按钮点击事件在表单之间正确切换

我有表格1和表格2。 表格1有:-文本框表格1 -按钮窗体1 表格2有:-文本框表格2 -按钮窗体2

我想点击按钮Form1事件转到Form2。然后我想将一些消息写入TextBoxForm2,然后按按钮Form2,它将再次转到Form1,来自TextBoxForm2的消息将显示在TextBoxForm1中

一切正常,但我有一个问题。当我关闭应用程序并希望调试并再次启动它时,会出现一些错误,如:“应用程序已在运行”

表格1:

public static string MSG;
public Form1()
    {
        InitializeComponent();
        TextBoxForm1.Text = MSG;
    }
private void ButtonForm1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        this.Hide();
//There is probably my fault but when I was trying this.Close(); everything shutted down
        form2.Show();
    }
表格2:

private void ButtonForm2_Click(object sender, EventArgs e)
    {
        Form1.MSG = TextBoxForm2.Text;
        Form1 form= new Form1();
        form.Show();
        this.Close();
    }

请问我如何才能正确地执行此操作?:)我是初学者,谢谢

我不会像你提到的那样在表单之间使用STATIC进行传递,你是一个初学者,但是让我们来为你做个总结

在主窗体中,创建一个新方法来处理注释中提到的事件调用。然后,创建第二个表单后,附加到其关闭事件以强制表单1再次可见

//在你一年级的班级里

void ReShowThisForm( object sender, CancelEventArgs e)
{
   // since this will be done AFTER the 2nd form's click event, we can pull it
   // into your form1's still active textbox control without recreating the form
   TextBoxForm1.Text = MSG;
   this.Show();
}
你在哪里创建form2

private void ButtonForm1_Click(object sender, EventArgs e)
{
   Form2 form2 = new Form2();
   form2.Closing += ReShowThisForm;
   this.Hide();
   form2.Show();
}
在第二次表单单击中,只需设置静态字段并关闭表单

private void ButtonForm2_Click(object sender, EventArgs e)
{
   Form1.MSG = TextBoxForm2.Text;
   this.Close();
}

简单的解决方法是使用模态形式。临时显示
Form2
,显示时
Form1
不可见

var form2 = new Form2();
this.Visible = false; // or Hide();
form2.ShowDialog(this);
this.Visible = true;
要传递数据,您可以在
表单2中定义属性,例如:

public string SomeData {get; set;}
Form1
必须设置
SomeData
,您可以将其放入显示的
中并显示出来。相同的属性可用于从
Form2
(关闭前)获取数据


为form2的FormClosing事件编写事件处理程序。这表明您需要使主窗口再次可见。是的,showDialog是一个不错的选择,但我们不知道表单正在/将要执行的其他意图。另外,如果需要从第二个表单返回到第一个表单的多个设置,该怎么办。有很多方法可以解决问题,但我只是根据他们已经开始的方法来做。了解如何/在何处使用事件处理程序总是很好的。@DRapp,我有一个坏习惯,就是在每个问题中都看到XY问题,所以这里有另一个解决方案;)
// form 1 click
var form2 = new Form2() { SomeData = TextBoxForm1.Text; }
this.Visible = false;
form2.ShowDialog(this);
this.Visible = true;
TextBoxForm1.Text = form2.SomeData;

// form 2 shown
TextBoxForm2.Text = SomeData;

// form 2 click
SomeData = TextBoxForm2.Text;
Close();