3

からの特定の子の複数のインスタンスを含むことができるMDI親ウィンドウがあります。これをfrmChildと呼びます。親から特定のコントロールがクリックされたときに、アクティブなfrmChildを取得し、frmChildから特定のメソッドを呼び出す必要があります。

以下は、私が達成しようとしていることのイメージです(アクティブなMDI子を取得し、そのクラスから特定のメソッドを呼び出します)。

忙しい猫

これで、各frmChildは次のようにインスタンス化されます。

private void newFileToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        frmNewDocument = new frmNewDocument();
        frmNewDocument.MdiParent = this;
        frmNewDocument.Show();
    }

アクティブなfrmChildからメソッドを呼び出したい場合、次のことを試みてスタックします。

private void saveFileToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        /* get active MDI child*/
        Form frmActiveNewDocument = this.ActiveMdiChild;           
        
        /* make sure MDI child is a "New Document" type form */
        if (frmActiveNewDocument.GetType() == frmNewDocument.GetType())
        {
            /* invoke a method from active frmChild here */
        }
    }

私はまだOOPを学んでおり、これがいくつかの原則であると確信しています。それが記事で言及されることができれば、それも素晴らしいでしょう。

**注:frmChildの干渉がこの問題に取り組むための最良の方法であるため、メインフォームが各frmChildを掘り下げる必要がないことを読みました。そのため、frmChildが使用するインターフェイスを作成しました。**

 public interface NewFileFormInterface
{
    void saveFile();
}

ここで、saveFile()は、メインから呼び出したいメソッドであり、frmChildに実装されています。

この問題に関する助けと私が研究できるいくつかのキーワードは素晴らしいでしょう。

TIA!

4

4 に答える 4

2
frmNewDocument child = ActiveMdiChild as frmNewDocument;
if (child != null)
{
    child->saveFile();
}

asキーワードは、ランタイムキャストを実行します。オブジェクト(この場合はActiveMdiChild)がnullであるか、asタイプではない場合、結果はnullになります。

http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

また、以下を読むことにも興味があるかもしれません: .Net命名規則ガイドライン

于 2012-05-22T17:52:49.280 に答える
1

これを試して:

if (ActiveMdiChild is frmNewDocument)
{
    (ActiveMdiChild as frmNewDocument).saveFile();
}
于 2012-05-22T17:57:54.840 に答える
1

私はこれが古いことを知っていますが、これはいつも私のために働いてきました。

子コードの場合:

public void SaveFile()
{
  // Some code goes here.
}

そして親コードでは:

frmNewDocument child = this.ActiveMdiChild as frmNewDocument;
if(child != null)
{
  child.SaveFile();
}

これが、より簡潔な答えを探している他の誰かに役立つことを願っています。

于 2014-04-10T19:07:13.743 に答える
0

私はこのようにしました。「AuditAddMod」はフォームです。私には平行した子供がいます。その形式には、兄弟形式で必要なことを実行するパブリック「PassData()」メソッドがあります。

private void LoadRelatedFollowUpAuditTable()
{
   foreach (Form form in this.MdiParent.MdiChildren)
   {
      if (form.Name == "AuditAddMod" && form.Text != this.Text)
      {
         ((AuditAddMod)form).PassData(form.Name, 1);
      }
   }
}
于 2020-04-30T18:32:16.977 に答える