そのフォームがすでに開かれている場合、MDIコンテナ内の特定のフォームが開かないようにする方法はありますか?
22140 次
7 に答える
36
OpenFormsコレクションを調べて、指定されたタイプのフォームがすでに存在するかどうかを確認できます。
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
于 2009-10-12T08:27:43.347 に答える
3
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
ください。
于 2009-10-12T08:27:36.063 に答える
1
このコードは機能しています
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();
}
于 2014-01-05T20:34:39.273 に答える
0
Generics (C# および VB.net オプションの下) を使用してメソッドを実装できます。これは、異なる MDI フォームを開く必要がある場合に役立ちます。
C#
private void OpenMDI<T>(bool multipleInstances)
where T : Form, new()
{
if (multipleInstances == false)
{
// Look if the form is open
foreach (Form f in this.MdiChildren)
{
if (f.GetType() == typeof(T))
{
// Found an open instance. If minimized, maximize and activate
if (f.WindowState == FormWindowState.Minimized)
{
f.WindowState = FormWindowState.Maximized;
}
f.Activate();
return;
}
}
}
T newForm = new T();
newForm.MdiParent = this;
newForm.Show();
}
次のように使用します(それらを防ぐために指定false
してください)multipleInstances
OpenMDI<Form2>(false);
VB.NET
Public Sub Open_MDI(Of T As {New, Form})(bMultipleInstances As Boolean)
If bMultipleInstances = False Then
For Each f As Form In Me.MdiChildren
If TypeOf f Is T Then
If (f.WindowState = FormWindowState.Minimized) Then
f.WindowState = FormWindowState.Maximized;
End If
f.Activate()
Exit Sub
End If
Next
End If
Dim myChild As New T()
myChild.MdiParent = Me
myChild.Show()
End Sub
次のように使用します(それらを防ぐためにをFalse
示します)bMultipleInstances
Open_MDI(Of Form2)(False)
于 2018-04-14T00:17:56.947 に答える
0
この投稿は非常に古いですが、これが助けになると思いました。
フォームも最小化されている場合に処理する必要があります。完全な例を次に示します。
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();
于 2016-06-17T11:16:46.443 に答える