Открытие нескольких экземпляров дочерней формы в форме MDI с уникальными идентификаторами - PullRequest
1 голос
/ 21 декабря 2011

В моем приложении я хочу иметь возможность открывать новый экземпляр формы как дочерний элемент несколько раз, пока у них есть уникальный идентификатор.

В данный момент я делаю так:

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) я могу программно делать такие вещи, как BringToFront или Close или ... с помощью свойства Text дочернего элементаформы, открытые в настоящее время в основной форме
  2. Я не должен быть гением, чтобы выяснить, что этот способ уникального именования дочерних форм не работает.Если я открою 5 дочерних форм (той же формы), они будут пронумерованы как Console #1 до Console #5.Но если я закрою, скажем, Console #4, и если я открою новую форму (той же формы!), Она будет названа Console #5, тогда у меня будет две формы с одинаковым именем.если это можно исправить, это будет хорошо для различимости форм пользователем.

С нетерпением ждем ваших советов в таком случае!

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Я думаю, что логика немного нарушена с переменной _consoleWindowCount.

Поскольку вы передаете идентификационный номер в конструкторе ConsoleForm, просто добавьте свойство ReadOnly в эту форму, чтобы вы могли использоватьномер идентификатора:

Пример:

public class ConsoleForm : Form {
  private int _FormID;

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

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

Создание новых форм потребует от вас перебора всей дочерней коллекции и поиска доступного идентификатора для создания:

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();
  }
}
0 голосов
/ 21 декабря 2011

Попробуйте назначить GUID в качестве идентификатора:

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

Затем вы можете сохранить GUID в форме Tag и создать FormManager, в котором будут храниться идентификаторы, чтобы позже вы могли получить их.

Надеюсь, это поможет.

...