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

时间:2015-04-08 00:38:22

标签: c# winforms

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

我还希望它是无模式的(他们可以使用主GUI,而辅助对话仍然在后台打开)

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

在此示例中,我可以通过单击图片打开尽可能多的ADCsdiag个对话框。我想限制打开这种类型的一个或没有对话。

3 个答案:

答案 0 :(得分:2)

在方法之外定义它,并订阅其Closing事件。

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

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();
    }
}

答案 1 :(得分:2)

以下是我在评论中提到的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,然后在Form_Load中,将它添加到集合中,如下所示:

formsCollection.Add(this);

Disposed

formsCollection.Remove(this);

如果已加载Activate,则可以Form,而不是打开新实例。

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;
}

答案 2 :(得分:0)

您可以通过在局部变量中保留表单实例并在需要时实例化它来完成此操作:

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();
}