1

これは少し異なる質問か、簡単な質問かもしれません。しかし、私は今この問題を抱えています。

と の 3 つのフォームloginFormmainFormありsubFormます。
私のアカウントには、アクセス用とアクセスloginForm用の 2 つのアカウントがあります。は との両方にアクセスできますが、は にしかアクセスできません。(は単一インスタンス)の複数のインスタンスを作成できます。mainFormsubForm
mainFormAccessAccountmainFormsubFormsubFormAccessAccountsubForm
mainFormsubFormmainForm

今私の問題は次のとおりです。とそのインスタンス(によって作成されたインスタンスsubForm_Closedイベント関数を実装したいです。subFormmainForm

以下のコードを使用してsubFormsubForm.csのインスタンスを作成しました。

private mainForm MainForm;
    internal void RegisterParent(mainForm form)
    {
        this.MainForm = form;
    }

のインスタンスを作成するためにmainForm.cssubFormで、次のコードを使用しました。

subForm newSubForm = new subForm();
newSubForm.Show();
newSubForm.RegisterParent(this);

この問題を解決するにはどうすればよいですか?
(私はドットネット初心者なので、インスタンスと呼ばれているかどうかはわかりません)

前もって感謝します。

4

4 に答える 4

2

あなたの問題を正しく理解していれば、サブフォームのクローズ イベントに 2 つの異なるハンドラーが必要です。

  1. subFormAccessAccount によって作成されたサブフォームのクローズ イベントの 1 つのハンドラー
  2. MainForm を介して作成されたサブフォームのクローズ イベントの別のハンドラー

ご想像のとおり、これは確かに簡単な問題です。あなたは .net 初心者だとおっしゃっていたので、詳しく説明します。

私が間違っていなければ、subForm_ClosedVisual Studio デザイナー サーフェスを使用してイベント ハンドラーを生成しました。これがあなたの混乱の原因のようです。

イベント ハンドラーを生成するために、Visual Studio デザイナーは何をしますか。

SubForm.cs を開くと、そのコンストラクターの定義に注目してください。こんな感じになります

public SubForm()
{
     InitializeComponent();
     //May be some other code as well
}

このInitializeComponent方法は、SubForm.designer.cs ファイル () に記述されています (ソリューション エクスプローラーで SubForm.cs を展開すると表示されます)。

メソッドの行の1つは次のInitializeComponentようになります

this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.SubForm_Closed);

したがって、実際には、subFormAccessAccount または MainForm を介してサブフォームの「インスタンス」(ここでは実際のオブジェクト インスタンスを意味し、質問で言及した意味ではなく、せいぜい子フォーム) を作成するとすぐに、SubForm_Closed イベントが添付されます。 FormClosed イベントへのハンドラー。

どうすれば望ましい動作を得ることができますか?

SubForm.csでclosedイベントを処理したい場合は、次のようにすることができます

internal void RegisterParent(mainForm form)
{
    this.MainForm = form;
    this.FormClosed -= SubForm_Closed; //Unhook previous handler
    this.FormClosed += SubFormAsChild_Closed; //hook new handler
}

MainForm.cs でクローズド イベントを処理する場合は、次のようにします。

internal void RegisterParent(mainForm form)
{
    this.MainForm = form;
    this.FormClosed -= SubForm_Closed;
}

//in MainForm.cs
newSubForm.RegisterParent(this);
newSubForm.FormClosed += newSubForm_Closed;
于 2012-10-05T11:54:20.250 に答える
1

サブフォームに別のコンストラクターを追加するいくつかの方法

例えば

public SubForm(Boolean argCreatedByMainForm) : this()
{
// save argument in private member variable for use in OnCloseQuery
}

次に使用します

subForm newSubForm = new subForm(true);
newSubForm.Show();
newSubForm.RegisterParent(this); 

あるフォームに別のフォームを認識させると、メンテナンスの悪夢に変わる傾向があるため、これは私が行う方法ではありませんが、より良いソリューションを実装するには、プログラミングボックスにさらにいくつかのツールが必要になります。たとえば、フォーム間の相互作用を管理し、それらをインターフェースに抽象化するクラス。最後に、動作を注入します。

あなたが学んでいるのを見て、コンストラクターを動かして、あなたがテクニックを習得するにつれてあなたは愚かな賢さに進むことができます

于 2012-10-05T13:02:53.833 に答える
0

メインフォームの別の構造、つまりサブフォーム参照を使用することをお勧めします。

サブフォームは、System.Windows.Forms.Control から派生した System.Windows.Forms.Form から派生したもので、実際には親コントロールを格納するプロパティが 1 つあるため、メイン フォームへの参照をそこに格納する必要があります。

もう1つは、メインフォームにサブフォームを作成するための静的メソッドを実装する必要があることです。これは、単一インスタンス参照のプライベートメソッドを実際に呼び出して、実際のサブフォームを作成します-シングルトンパターンを想定しています。

コードは次のようになります

public class MainForm : System.Windows.Forms.Form 
{
  // used to hold references to subforms note: not static
  private List<SubForm> mySubForms;

  // singelton implementation
  private static MainForm theInstance = null;      
  private MainForm()
  {
     mySubForms = new List<SubForm>();
  }
  public static MainForm GET_INSTANCE()
  {
     if (MainForm.theInstance == null)
     {
       MainForm.theInstance = new MainForm();
     }
     return MainForm.theInstance;
  }

  // creates subforms and the references right not:static method as singelton 
  //pattern is used
  public static SubForm CREATE_SUBFORM()
  {
     SubForm newSub = new SubForm();
     newSub.Parent = theInstance;
     theInstance.mySubForms.Add(newSub);
     return newSub;
  }
}

コードに入力エラーがある場合はご容赦ください...私は今IDEを持っていません。明らかに、singelton パターンのスレッドセーフを実装しませんでした...これは、デモンストレーションの目的でエッジを処理することになります。

編集:さらに良い方法は、イベントを利用してフォームを通信させることです。マルチスレッド アプリケーションを計画している場合は、これが最適な方法です。しかし、これには高度な .Net スキルが必要です。

于 2012-10-05T11:57:11.513 に答える
0
subForm newSubForm = new subForm();
newSubForm.Show();
newSubForm.RegisterParent(this);
newSubForm.Close += (s, e) =>
{
   // Close event will be fired for this instance only.
};
于 2012-10-05T11:30:08.683 に答える