我正在开发一款在C#中使用Windows窗体的游戏。我希望能够使用第一个表单来调用第二个表单。我有这个工作。然后我想第二个表单将数据发送回第一个表单而不是创建第一个表单的新实例。可以这样做吗?我知道我需要设置我的属性,以便我可以将变量从一种形式设置到另一种形式。我只是不确定如何在不创建新实例的情况下调用第一个表单。 有没有办法可以做到这一点? 例如,如果我有表单A创建表单B的实例,我可以让表单B做一些工作并将数据发送回原始表单A而不创建表单A的新实例吗?
答案 0 :(得分:0)
如果不了解您的全部要求,很难说。但通常我会这样(Somewhat伪代码)。
Form2 dialogForm = new Form2();
if(dialogForm.ShowDialog() == DialogResult.OK)
{
this.PropertyOnForm1 = dialogForm.PropertyOnForm2
}
这个过程依赖于你的第二个形式是一个对话框。您需要在Form2上设置dialogresult按钮,并具有一个公共属性,一旦对话框完成,将从Form1访问该属性。
如果这不起作用,请告诉我,我会写一个不同的答案。
答案 1 :(得分:0)
如果您不立即使用发回的数据Form A
,则可以使用Form_Closing
事件处理程序Form B
,然后使用Form B
中的公共属性。
在Form 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
}
}
在你的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; }
答案 2 :(得分:0)
由于您要在Form1
中创建Form2,因此您可以在Form2
中创建自定义事件,并在创建Form1
时在Form2
中订阅该事件,如果当您关闭时,您将从Form2
返回信息,然后Edper或MindingData的答案将起作用。
<强> Form1中强>
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());
}
}