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

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

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

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, тогда у меня будет две формы с одинаковым именем. если это можно исправить, будет здорово, если формы будут различимы пользователем.

Ждем ваших советов в таком случае!


person Saeid Yazdani    schedule 21.12.2011    source источник


Ответы (2)


Я думаю, что логика немного нарушена с переменной _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();
  }
}
person LarsTech    schedule 21.12.2011
comment
Спасибо, это было весьма полезно! - person Saeid Yazdani; 21.12.2011

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

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

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

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

person Daniel Peñalba    schedule 21.12.2011
comment
Спасибо, это делает его более уникальным. Но также мне нужно, чтобы свойство Text каждой новой открытой формы различалось пользователем. - person Saeid Yazdani; 21.12.2011