해당 양식이 이미 열려있는 경우 MDI 컨테이너 내에서 특정 폼을 열지 못하게 할 방법이 있습니까?중복 MDI 자식 폼 방지
답변
:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
가 AFAIK 표준 방법이 없습니다를 참조하십시오. 직접 구현해야합니다. 나는 이런 식으로 할 거라고 : 스레드 안전이 우려입니다
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);
}
}
경우 해당 lock
의를 추가합니다.
스레드 안전은 문제가되지 않습니다 vb.net에서 나를 위해이 코드가 작동 . – Groo
당신은 이것이 싱글 톤 패턴의 구현임을 추가 할 수 있습니다. 나는 Fredrik Mörk의 솔루션을 선호하지만, SOC –
이 게시물은 매우 오래지만, 내가 생각
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();
}
작업이 코드 그러면 도움이 추가됩니다.
양식이 최소화 된 경우에도 처리해야합니다. 여기에 완벽한 예입니다
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();
당신은 단지 하나의 스레드에서 GUI 컨트롤에 액세스하기 때문에
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()
대신 form.Activate()를 사용한다. form.WindowState = FormWindowState.Normal; 전자와 달리 후자는 해당 창을 최소화하더라도 작동합니다. – docesam