如何使用C#停止窗口窗体以在单击时重新打开?
我使用的是包含菜单的父窗口窗体,当我再次单击同一菜单时,它会打开一个新窗口。那么,如果窗口已经打开,如何阻止它重新打开呢?它不应该每次单击时都显示窗口窗体。您可以维护打开窗体的列表(并在onClick事件中检查列表),或者在窗体打开或关闭时禁用/启用菜单项。您可以维护打开窗体的列表(并在onClick事件中检查列表),或在窗体打开或关闭时禁用/启用菜单项。使用属性如何使用C#停止窗口窗体以在单击时重新打开?,c#,.net,winforms,mdi,event-handling,C#,.net,Winforms,Mdi,Event Handling,我使用的是包含菜单的父窗口窗体,当我再次单击同一菜单时,它会打开一个新窗口。那么,如果窗口已经打开,如何阻止它重新打开呢?它不应该每次单击时都显示窗口窗体。您可以维护打开窗体的列表(并在onClick事件中检查列表),或者在窗体打开或关闭时禁用/启用菜单项。您可以维护打开窗体的列表(并在onClick事件中检查列表),或在窗体打开或关闭时禁用/启用菜单项。使用属性 Boolean found = Application.OpenForms.Cast<Form>().Any(f
Boolean found =
Application.OpenForms.Cast<Form>().Any(form => form.ID == "TargetFormID"
if (!found)
{
// Open a new instance of the form //
}
找到的布尔值=
Application.OpenForms.Cast().Any(form=>form.ID==“TargetFormID”
如果(!找到)
{
//打开表单的新实例//
}
使用属性
Boolean found =
Application.OpenForms.Cast<Form>().Any(form => form.ID == "TargetFormID"
if (!found)
{
// Open a new instance of the form //
}
找到的布尔值=
Application.OpenForms.Cast().Any(form=>form.ID==“TargetFormID”
如果(!找到)
{
//打开表单的新实例//
}
2种方式:
方式1,标志:为打开的表单保留一个标志(或标志列表)。
每次打开表单(创建一个新的()表单)时,将标志设置为“true”。
表单关闭时,将标志设置为false。
在按钮的click事件中,在创建新表单之前,检查标志以查看表单是否已打开 方式2,保留一个参考:
在主窗体中保留对您正在使用的所有窗体的引用。
当表单未打开时,将其初始化为null。
打开新表单时,请设置对该表单的引用。
在按钮的click事件上,在创建新表单之前检查表单的引用是否为null 我更喜欢第二种方式。当您有对所有子表单的引用时,更容易控制您的资源。2种方式: 方式1,标志:
为打开的表单保留一个标志(或标志列表)。
每次打开表单(创建一个新的()表单)时,将标志设置为“true”。
表单关闭时,将标志设置为false。
在按钮的click事件中,在创建新表单之前,检查标志以查看表单是否已打开 方式2,保留一个参考:
在主窗体中保留对您正在使用的所有窗体的引用。
当表单未打开时,将其初始化为null。
打开新表单时,请设置对该表单的引用。
在按钮的click事件上,在创建新表单之前检查表单的引用是否为null
我更喜欢第二种方法。当您有对所有子表单的引用时,更容易控制您的资源。另一个原因是在
表单中创建属性,该属性保留您使用的默认实例
private static Form _defaultInstance;
public static Form DefaultInstance()
{
get {
if(_defaultInstance == null || _defaultInstance.IsDisposed)
{
_defaultInstance = new yourTypeHere();
}
return _defaultInstance;
}
}
现在您总是通过此属性访问窗口:
yourTypeHere.DefaultInstance.Show();
另一个原因是在表单
中创建一个属性
,它保留您使用的默认实例
private static Form _defaultInstance;
public static Form DefaultInstance()
{
get {
if(_defaultInstance == null || _defaultInstance.IsDisposed)
{
_defaultInstance = new yourTypeHere();
}
return _defaultInstance;
}
}
现在您总是通过此属性访问窗口:
yourTypeHere.DefaultInstance.Show();
你能在菜单项的click()中显示代码吗?我敢打赌,这是因为每次调用事件处理程序时都会重新创建该表单对象。如果没有代码,则无法调试类似的问题。我坐得离屏幕不够近,无法看到它。请编辑您的问题,将MDIParent表单中的Click
事件处理程序方法包括在内。能否在该菜单项的Click()中显示代码?我敢打赌,这是因为每次调用事件处理程序时都要重新创建表单对象。如果没有代码,就无法调试类似的问题。我坐得离屏幕不够近,无法看到它。请编辑您的问题,将MDIParent表单中的Click
事件处理程序方法包括在内。@Nick:您没有遗漏太多;这会鼓励您d实践。您确实应该维护对已创建表单的每个实例的引用,而不是遍历此集合以查找匹配项。实际上(至少在某些情况下),这看起来是一个很好的方法,因为它还可以在表单名称上进行索引。或者bool found=Application.OpenForms.Cast().Any(p=>p.ID==“TargetFormID”)
。我喜欢LINQ:P@Nick:您没有遗漏太多内容;这会导致相当糟糕的做法。您确实应该维护对已创建表单的每个实例的引用,而不是遍历此集合以查找匹配项。实际上(至少在某些情况下)这看起来是一个很好的方法,因为它也可以在表单的名称上进行索引。或者boolfound=Application.OpenForms.Cast().Any(p=>p.ID==“TargetFormID”)
。我喜欢LINQ:p