检查C#,Windows窗体中是否已打开无模式对话框

检查C#,Windows窗体中是否已打开无模式对话框,c#,winforms,C#,Winforms,我想在点击图片时打开一个对话框,但我也不希望用户能够打开一个已经打开的对话框 我还希望它是无模式的(他们可以在后台打开第二个对话框时使用主GUI) 在本例中,我可以通过单击图片打开任意数量的ADCsdiag对话。我只想打开一个或不打开这种类型的对话。在方法之外定义它,并订阅它的关闭事件 您可以根据需要显示它,当用户“关闭”它时,您实际上可以取消关闭并隐藏它。如果他们反复按下按钮,表单最多只显示一次 public partial class Form1 : Form { private A

我想在点击图片时打开一个对话框,但我也不希望用户能够打开一个已经打开的对话框

我还希望它是无模式的(他们可以在后台打开第二个对话框时使用主GUI)


在本例中,我可以通过单击图片打开任意数量的
ADCsdiag
对话。我只想打开一个或不打开这种类型的对话。

在方法之外定义它,并订阅它的
关闭事件

您可以根据需要显示它,当用户“关闭”它时,您实际上可以取消关闭并隐藏它。如果他们反复按下按钮,表单最多只显示一次

public partial class Form1 : Form
{
    private ADCs ADCsdiag = new ADCs();

    public Form1()
    {
        InitializeComponent();

        ADCsdiag.Closing += (sender, eventArgs) =>
            {
                eventArgs.Cancel = true;
                ((ADCs)sender).Hide();
            };
    }

    private void pictureBox18_Click(object sender, EventArgs e)
    {
        ADCsdiag.Show();
    }
}

在方法之外定义它,并订阅它的
关闭
事件

您可以根据需要显示它,当用户“关闭”它时,您实际上可以取消关闭并隐藏它。如果他们反复按下按钮,表单最多只显示一次

public partial class Form1 : Form
{
    private ADCs ADCsdiag = new ADCs();

    public Form1()
    {
        InitializeComponent();

        ADCsdiag.Closing += (sender, eventArgs) =>
            {
                eventArgs.Cancel = true;
                ((ADCs)sender).Hide();
            };
    }

    private void pictureBox18_Click(object sender, EventArgs e)
    {
        ADCsdiag.Show();
    }
}

您可以通过在局部变量中保留表单实例并在需要时实例化它来实现这一点:

private ADCs _ADCsdiag;

private void pictureBox18_Click(object sender, EventArgs e)
{
   if (_ADCsdiag == null) { 
      _ADCsdiag = new ADCs(); 
      _ADCsdiag.Closed += (s, e) =>
       {
          _ADCsdiag= null;
        };
   }
   ADCsdiag.Show();
}

您可以通过在局部变量中保留表单实例并在需要时实例化它来实现这一点:

private ADCs _ADCsdiag;

private void pictureBox18_Click(object sender, EventArgs e)
{
   if (_ADCsdiag == null) { 
      _ADCsdiag = new ADCs(); 
      _ADCsdiag.Closed += (s, e) =>
       {
          _ADCsdiag= null;
        };
   }
   ADCsdiag.Show();
}

下面是我在评论中提到的
FormsCollection
类:

public class FormsCollection : IEnumerable
{
    private Collection c = new Collection();

    public Form Item {
        get { return c.Item(index); }
    }

    public void Add(Form frm)
    {
        c.Add(frm);
    }

    public virtual IEnumerator GetEnumerator()
    {
        return c.GetEnumerator;
    }

    public void Remove(Form frm)
    {
        int itemCount = 0;

        for (itemCount = 1; itemCount <= c.Count; itemCount++) {
            if (object.ReferenceEquals(frm, c.Item(itemCount))) {
                c.Remove(itemCount);
                break;
            }
        }
    }
}
并在
中处置

formsCollection.Remove(this);
这将允许您
激活
表单(如果已加载),而不是打开新实例

if (FormLoaded(yourForm.Name))
{
    yourForm.Activate()
}
else
{
    yourForm.Show()
}
以下是
FormLoaded
函数:

public bool FormLoaded(string strFormName)
{
    bool functionReturnValue = false;
    foreach (Form f in Forms) {
        if (f.Name == strFormName) {
            functionReturnValue = true;
            break;
        }
    }
    return functionReturnValue;
}

下面是我在评论中提到的
FormsCollection
类:

public class FormsCollection : IEnumerable
{
    private Collection c = new Collection();

    public Form Item {
        get { return c.Item(index); }
    }

    public void Add(Form frm)
    {
        c.Add(frm);
    }

    public virtual IEnumerator GetEnumerator()
    {
        return c.GetEnumerator;
    }

    public void Remove(Form frm)
    {
        int itemCount = 0;

        for (itemCount = 1; itemCount <= c.Count; itemCount++) {
            if (object.ReferenceEquals(frm, c.Item(itemCount))) {
                c.Remove(itemCount);
                break;
            }
        }
    }
}
并在
中处置

formsCollection.Remove(this);
这将允许您
激活
表单(如果已加载),而不是打开新实例

if (FormLoaded(yourForm.Name))
{
    yourForm.Activate()
}
else
{
    yourForm.Show()
}
以下是
FormLoaded
函数:

public bool FormLoaded(string strFormName)
{
    bool functionReturnValue = false;
    foreach (Form f in Forms) {
        if (f.Name == strFormName) {
            functionReturnValue = true;
            break;
        }
    }
    return functionReturnValue;
}

我处理这个问题的方法是添加一个
FormsCollection
类。在我想限制为一个实例的任何
表单中,我将把它添加到
formscolection
,然后在
Disposed
方法中,将它从
formscolection
中删除。如果我想限制为一个实例,我只需检查
表单
是否存在于
表单集合
@dubstyle中,我发现这是可行的。谢谢你的好意。如果您对解决方案感到满意,请务必进行投票和/或接受答案。我处理此问题的方法是添加
FormsCollection
类。在我想限制为一个实例的任何
表单中,我将把它添加到
formscolection
,然后在
Disposed
方法中,将它从
formscolection
中删除。如果我想限制为一个实例,我只需检查
表单
是否存在于
表单集合
@dubstyle中,我发现这是可行的。谢谢你的好意。如果您对解决方案感到满意,请务必进行投票和/或接受答案。