在我的应用程序中,我希望能够多次打开表单的新实例,同时拥有唯一标识符。
目前我喜欢这样:
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
}
目前我有两个问题:
Console #1
到Console #5
。但是,如果我关闭,请说Console #4
,如果我打开一个新表单(相同形式!),它将被命名为Console #5
,然后我将有两个同名的表单。如果可以解决这个问题,那么用户可以区分表格会很棒。期待您在这种情况下提示!
答案 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
,以便稍后检索。
希望它有所帮助。