[c#] Windows Form이 이미 열려 있는지 확인하고 열려있는 경우 닫는 방법은 무엇입니까?

10 분마다 열리는 간단한 정보 창인 “fm” 양식이 있습니다 ( fm.Show();).

10 분마다 “fm” 양식 이 열려 있는지 확인 하고 열려 있으면 닫았다가 다시 열도록 할 수 있습니다!

이제 양식 fm은 항상 생성 form fm = new form();
되므로 양식이 열려 있는지 확인하려고 할 때 이전에 양식이 하나 있어도 항상 거짓이고 새 창을 엽니 다!

고유 한 신원을 부여 할 수있는 도구가 필요하며 고유 한 신원을 가진이 양식이 열렸는지 확인해야합니다!

버튼이있는 복잡한 정보가 있기 때문에 양식 (fm)의 데이터 만 업데이트하고 싶지 않습니다.

양식 이름은 "UpdateWindow"

감사



답변

아마도 이것이 도움이 될 것입니다.

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
     if (frm.Name == "YourFormName")
     {
         bFormNameOpen = true;
     }
}

foreach의 일부 코드는 특정 형식을 감지하고 수행 할 수 있습니다. 그래도 테스트되지 않았습니다.

에서 찾을 수 http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms


답변

늦었다는 건 알지만 … 궁금한 분들을 위해 …

if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
    Application.OpenForms.OfType<UpdateWindow>().First().Close();

UpdateWindow frm = new UpdateWindow()
frm.Show();


답변

메뉴에서 양식을 호출하고 MDI 양식을 클릭한다고 가정하면 다음과 같이 최상위 수준에서 해당 양식의 인스턴스 선언을 만들어야합니다.

Form1 fm = null;

그런 다음 다음과 같이 Form1을 호출하는 메뉴 클릭 이벤트를 정의해야합니다.

private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (fm == null|| fm.Text=="")
    {
        fm = new Form1();
        fm.MdiParent = this;
        fm.Dock = DockStyle.Fill;
        fm.Show();
    }
    else if (CheckOpened(fm.Text))
    {
        fm.WindowState = FormWindowState.Normal;
        fm.Dock = DockStyle.Fill;
        fm.Show();
        fm.Focus();
    }
}

CheckOpened는 Form1에 이미 열거 나하지되어 있는지 확인하기 위해 정의 :

private bool CheckOpened(string name)
{
    FormCollection fc = Application.OpenForms;

    foreach (Form frm in fc)
    {
        if (frm.Text == name)
        {
            return true;
        }
    }
    return false;
}

이것이 이미 열려 있거나 최소화 된 경우 메뉴 클릭시 Form1에 초점을 맞추는 양식의 여러 인스턴스를 만드는 문제가 해결되기를 바랍니다.


답변

나는 그 진술을 이해했는지 잘 모르겠습니다. 도움이 되었기를 바랍니다. 이 폼의 인스턴스를 하나만 사용하려면 사용자 닫기시 Form.Dispose 호출을 방지해야합니다 . 이를 위해 자식 폼의 Closing 이벤트를 처리 할 수 ​​있습니다.

private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}

그런 다음 새 인스턴스를 만들 필요가 없습니다 frm. 인스턴스에서 Show 메서드를 호출하기 만하면됩니다.

Form.Visible 속성을 확인하여 현재 양식이 열려 있는지 확인할 수 있습니다.

private ChildForm form = new ChildForm();

private void ReopenChildForm()
{
    if(form.Visible)
    {
        form.Hide();
    }
    //Update form information
    form.Show();
}

사실, 양식의 데이터를 업데이트하지 않는 이유를 여전히 이해하지 못합니다.


답변

Form fc = Application.OpenForms["UpdateWindow"];

if (fc != null)
   fc.Close();

fc.Show();


답변

Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
    fc.Close();
}

다음을 사용하여 원하는 경우 해당 양식을 다시 열 수 있습니다.

Form1 frm = New Form1();
frm.show();


답변

if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
    //form is visible
else
    //form is invisible

Form1양식의 이름은 어디에 있습니까 ?