私には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メソッドをコードで使用しました。