Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#停止窗口窗体以在单击时重新打开?_C#_.net_Winforms_Mdi_Event Handling - Fatal编程技术网

如何使用C#停止窗口窗体以在单击时重新打开?

如何使用C#停止窗口窗体以在单击时重新打开?,c#,.net,winforms,mdi,event-handling,C#,.net,Winforms,Mdi,Event Handling,我使用的是包含菜单的父窗口窗体,当我再次单击同一菜单时,它会打开一个新窗口。那么,如果窗口已经打开,如何阻止它重新打开呢?它不应该每次单击时都显示窗口窗体。您可以维护打开窗体的列表(并在onClick事件中检查列表),或者在窗体打开或关闭时禁用/启用菜单项。您可以维护打开窗体的列表(并在onClick事件中检查列表),或在窗体打开或关闭时禁用/启用菜单项。使用属性 Boolean found = Application.OpenForms.Cast<Form>().Any(f

我使用的是包含菜单的父窗口窗体,当我再次单击同一菜单时,它会打开一个新窗口。那么,如果窗口已经打开,如何阻止它重新打开呢?它不应该每次单击时都显示窗口窗体。

您可以维护打开窗体的列表(并在onClick事件中检查列表),或者在窗体打开或关闭时禁用/启用菜单项。

您可以维护打开窗体的列表(并在onClick事件中检查列表),或在窗体打开或关闭时禁用/启用菜单项。

使用属性

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