在具有唯一标识符的MDI表单中打开子表单的多个实例

时间:2011-12-21 13:24:43

标签: c# winforms mdichild mdiparent

在我的应用程序中,我希望能够多次打开表单的新实例,同时拥有唯一标识符。

目前我喜欢这样:

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

}

目前我有两个问题:

  1. 怎么可能从MDIForm(mainForm)我可以编程方式处理像BringToFront或Close这样的东西或者......通过主窗体中当前打开的子窗体的Text属性
  2. 我不应该是一个天才,要找出这种独特命名的方式,这种形式是不行的。如果我打开5个子表单(相同格式),则会将其编号为Console #1Console #5。但是,如果我关闭,请说Console #4,如果我打开一个新表单(相同形式!),它将被命名为Console #5,然后我将有两个同名的表单。如果可以解决这个问题,那么用户可以区分表格会很棒。
  3. 期待您在这种情况下提示!

2 个答案:

答案 0 :(得分: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; }
  }
}

创建新表单需要您遍历子集合并查找要创建的可用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();
  }
}

答案 1 :(得分:0)

尝试将GUID指定为ID:

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

然后,您可以将GUID存储在Tag格式中,并创建一个存储ID的FormManager,以便稍后检索。

希望它有所帮助。