私には2つの形式があります:
- スクリーンショットを作成するForm1。
- form1によって作成されたスクリーンショットを操作するための2つのボタンがあるForm2。
Form1には、スクリーンショットを保存するためのメソッドを含む「非表示」ボタンもあります。
私の質問:
form2からform1のボタンをクリックするにはどうすればよいですか?また、form1が閉じられてからform2も閉じられることを確認するにはどうすればよいですか?
私はこのようなことを試しましたが、form2の保存ボタンをクリックしても何も起こりません:
var form = Form.ActiveForm as Form1;
if (form != null)
{
form.button1.PerformClick();
}
まず、複数のフォームが機能する通常の方法は、スタートアップフォームを閉じると、セカンダリフォームも閉じることです。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);
}
}
Form2
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();
}
}
非表示のボタンを作成する代わりに、ボタンにリンクされていないメソッドを作成するだけです。
で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
。using System.Linq;
コードの先頭にが付いている場合にのみ機能するLINQメソッドをコードで使用しました。