我有两种形式:
Form1还有一个“隐藏”按钮,其中包含保存屏幕截图的方法。
我的问题:
如何从form2单击form1的按钮? 和 如何检查form1何时关闭然后关闭form2?
我尝试过这样的事情但是当我点击form2保存按钮时没有任何反应:
var form = Form.ActiveForm as Form1;
if (form != null)
{
form.button1.PerformClick();
}
答案 0 :(得分:5)
首先,多个表单的正常工作方式是,当您关闭“启动”表单时,辅助表单也将关闭。如果您要在Form2
中创建Form1
,我会使用(your second Forms Instance).Show(this)
来展示它。然后,您可以通过Form2的父属性访问该表单。即。
var form = (Form1)this.Owner();
然后,您应该能够访问Form1
的所有公共方法,而且我会使用您正在使用的代码来保存屏幕截图并放入公共方法,无需将其放入按钮的单击事件,尤其是在隐藏按钮的情况下。
这是一个简单的例子:
<强> Form1中强>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show(this);
}
}
<强>窗体2 强>
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var frm = (Form1)this.Owner;
if (frm != null)
frm.button1.PerformClick();
}
}
答案 1 :(得分:0)
而不是制作隐藏按钮,而不是将方法与按钮相关联。
在Form1.cs
:
public void SaveScreenshot()
{
//TODO: Save the Screenshot
}
在Form2.cs
:
Form1 form = Application.OpenForms.OfType<Form1>().FirstOrDefault();
if (form != null) {
form.SaveScreenshot();
}
另外,请务必将SaveScreenshot
方法声明为public
或internal
。
我更改了获取Form1
的代码。如果您点击Form2
上的按钮,则Form2
将成为ActiveForm
,因此您的代码永远不会“看到”Form1
。我在代码中使用了LINQ方法,只有在代码顶部有using System.Linq;
时才会有效。