Có cách nào để ngăn chặn việc mở một biểu mẫu nhất định trong vùng chứa MDI nếu biểu mẫu đó đã được mở không?Ngăn ngừa mẫu MDI trùng lặp cho trẻ em
Trả lời
Bạn có thể interate qua bộ sưu tập OpenForms để kiểm tra xem đã có một hình thức của loại nhất định:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
AFAIK không có cách tiêu chuẩn. Bạn sẽ phải tự mình thực hiện nó. Tôi sẽ làm theo cách này:
class TheForm: Form
{
private static TheForm Instance;
private TheForm() // Constructor is private
{
}
public static Show(Form mdiParent)
{
if (Instance == null)
{
// Create new form, assign it to Instance
}
else
Instance.Activate(); // Not sure about this line, find the appropriate equivalent yourself.
}
protected override OnFormClose(EventArgs e)
{
Instance = null;
base.OnFormClose(e);
}
}
Nếu an toàn chủ đề quan tâm, hãy thêm lock
s thích hợp.
an toàn Chủ đề không phải là một vấn đề, vì bạn chỉ truy cập điều khiển GUI từ một chủ đề duy nhất . – Groo
bạn có thể đã thêm rằng đây là việc triển khai mẫu đơn. Tôi thích giải pháp của Fredrik Mörk, nó không vi phạm SOC –
mã này làm việc
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(Form2))
{
form.Activate();
return;
}
}
Form2 newForm = new Form2();
newForm.MdiParent = this;
newForm.Show();
}
Mặc dù bài này là rất cũ, tôi nghĩ điều này sẽ thêm trợ giúp.
Cần xử lý nếu biểu mẫu được Giảm thiểu quá. Dưới đây là ví dụ hoàn chỉnh:
foreach (Form form in this.MdiChildren)
{
if (form.GetType() == typeof(frmMain))
{
if (form.WindowState == FormWindowState.Minimized)
{
form.WindowState = FormWindowState.Normal;
}
form.Activate();
return;
}
}
Form frm = new frmMain();
frm.MdiParent = this;
frm.Show();
Công trình này mã cho tôi trong vb.net
For Each f As Form In Application.OpenForms If TypeOf f Is form_name Then f.Activate() f.WindowState = FormWindowState.Normal f.StartPosition = FormStartPosition.WindowsDefaultLocation f.WindowState = FormWindowState.Maximized
Return
End If
Next
form_name .MdiParent = Me
form_name .Show()
thay vì form.Activate() sử dụng form.WindowState = FormWindowState.Normal; không giống như trước đây, sau này sẽ hoạt động ngay cả khi cửa sổ đó được thu nhỏ. – docesam