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

}

我目前有两个问题:

  1. 怎么可能从 MDIForm (mainForm) 我可以通过当前在主窗体中打开的子窗体的 Text 属性以编程方式执行诸如 BringToFront 或 Close 之类的操作
  2. 我不应该是一个天才发现这种子表单的唯一命名方式不起作用。Console #1如果我打开 5 个子表单(相同的表单),它们的编号会像Console #5. 但是,如果我关闭假设Console #4并且如果我打开一个新表单(相同的表单!)它将被命名Console #5,那么我将有两个具有相同名称的表单。如果可以解决此问题,那么对于用户可区分的表单将非常有用。

在这种情况下期待您的提示!

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; }
  }
}

创建新表单需要您遍历您的子集合并寻找可用的 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中,并创建一个FormManager存储 Id 的存储,以便稍后您可以检索。

希望能帮助到你。

于 2011-12-21T13:32:24.163 回答