1

私のアプリケーションでは、一意の識別子を持っている間、フォームの新しいインスタンスを子として複数回開くことができるようにしたいと考えています。

現時点では、私はこのようにしています:

private int _consoleWindowCount = 0;

private void tsBtNewConsole_Click(object sender, EventArgs e)
{
    _consoleWindowCount++;
    var consoleForm = new ConsoleForm(_consoleWindowCount) { MdiParent = this };
    consoleForm.FormClosing += delegate { _consoleWindowCount--; };
    consoleForm.Show();

    //This will open a new ConsoleForm with Text: Console #_consoleWindowCount 
    //Like:
    // Console #1
    // Console #2

}

現時点で 2 つの問題があります。

  1. MDIForm (mainForm) から、現在メイン フォームで開いている子フォームの Text プロパティによって、BringToFront や Close などをプログラムで実行できる可能性はありますか?
  2. 子フォームの一意の名前付けのこの方法が機能していないことを発見するのは天才ではありません。(同じフォームの) 5 つの子フォームを開くと、 のように番号が付けConsole #1られConsole #5ます。しかし、閉じConsole #4て、新しいフォーム (同じフォームの!) を開くと、名前が付けられConsole #5、同じ名前の 2 つのフォームが作成されます。これを修正できれば、フォームをユーザーが区別できるようになるのは素晴らしいことです。

そんな時のヒントをお待ちしております!

4

2 に答える 2

1

変数のロジックが少し壊れていると思い_consoleWindowCountます。

ConsoleForm コンストラクターで ID 番号を渡しているため、そのフォームに ReadOnly プロパティを追加するだけで、ID 番号を使用できます。

例:

public class ConsoleForm : Form {
  private int _FormID;

  public ConsoleForm(int formID) {
    _FormID = formID;
    this.Text = "Console #" + _FormID.ToString();
  }

  public int FormID {
    get { return _FormID; }
  }
}

新しいフォームを作成するには、children コレクションを繰り返し処理し、作成できる ID を探す必要があります。

private void tsBtNewConsole_Click(object sender, EventArgs e) {
  int nextID = 0;
  bool idOK = false;

  while (!idOK) {
    idOK = true;
    nextID++;
    foreach (ConsoleForm f in this.MdiChildren.OfType<ConsoleForm>()) {
      if (f.FormID == nextID)
        idOK = false;
    }
  }

  var consoleForm = new ConsoleForm(nextID);
  consoleForm.MdiParent = this;
  consoleForm.Show();
}

同じ繰り返しを使用して、作業するフォームを決定します。

private void ShowChildForm(int formID) {
  foreach (ConsoleForm f in this.MdiChildren.OfType<ConsoleForm>()) {
    if (f.FormID == formID)
      f.BringToFront();
  }
}
于 2011-12-21T16:55:37.397 に答える
0

GUIDをIDとして割り当ててみてください。

string id = Guid.NewGuid().ToString();

次にGUID、をフォームTagに保存し、IDを保存するを作成しFormManagerて、後で取得できるようにします。

それが役に立てば幸い。

于 2011-12-21T13:32:24.163 に答える