ProgramingTip

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

bestdevel 2020. 10. 26. 08:23
반응형

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양식의 이름은 어디에 있습니까?


시도하면 작동합니다.

//inside main class
Form1 Fm1 = new Form1();<br>

//in button click
if (Fm1.IsDisposed)
{
    Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();

MDICHILD 기능 현관을 사용해보십시오

public void mdiChild(Form mdiParent, Form mdiChild)
{
    foreach (Form frm in mdiParent.MdiChildren)
    {
        // check if name equals
        if (frm.Name == mdiChild.Name)
        {
            //close if found

            frm.Close();

            return;
        }
    }

    mdiChild.MdiParent = mdiParent;

    mdiChild.Show();

    mdiChild.BringToFront();
}


아래에 연결 시도.

private void frmMyForm_Deactivate(object sender, EventArgs e)
    {
        // Raise your flag here.
    }

이벤트 위의 연결을 통해 양식이 최소화 될 때마다 다른 양식에 의해 부분적으로 / 완전히 숨겨 질 때마다 알려줍니다.


이것은 내가 모든 열린 양식을 닫는 것입니다 (기본 양식 제외)

    private void CloseOpenForms()
    {

           // Close all open forms - except for the main form.  (This is usually OpenForms[0].
           // Closing a form decrmements the OpenForms count
           while (Application.OpenForms.Count > 1)
           {
               Application.OpenForms[Application.OpenForms.Count-1].Close();
           }
    }

재미 있네요.이 추가해야합니다.

1) form.show ()에 전역 변수를 추가하고 form.close ()에서 변수를 지합니다.

2) 부모 양식에 타이머를 추가하십시오. 자녀 양식을 열어두고 10 분마다 데이터를 업데이트하십시오.

3) 마이너스 폼에 타이머를 넣어 데이터를 업데이트합니다.


* 희망이 당신을 위해 작동합니다

System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}

이 시도

 bool IsOpen = false;
    foreach (Form f in Application.OpenForms)
    {
        if (f.Text == "Form2")
        {
            IsOpen = true;
            f.Focus();
            break;
        }
    }

    if (IsOpen == false)
    {
        Form2 f2 = new Form2();
        f2.MdiParent = this;
        f2.Show();
    }

 private static Form IsFormAlreadyOpen(Type formType)
 {
     return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
 }

한 번만 형성

양식의 여러 삽입을 허용하는 것이 목표 인 경우 다음을 고려하십시오.

public class MyForm : Form
{
    private static MyForm alreadyOpened = null;

    public MyForm()
    {
        // If the form already exists, and has not been closed
        if (alreadyOpened != null && !alreadyOpened.IsDisposed)
        {
            alreadyOpened.Focus();            // Bring the old one to top
            Shown += (s, e) => this.Close();  // and destroy the new one.
            return;
        }           

        // Otherwise store this one as reference
        alreadyOpened = this;  

        // Initialization
        InitializeComponent();
    }
}

Form user_rpt = Application.OpenForms["frmUesr_reports"];
        if (user_rpt == null)
        {
            /// Do Something here
        }

시도 시도가 양식이 있는지 여부를 확인하는 간단한 아이디어입니다.


내 앱에는 여러 다른 양식 (하위 양식)으로 이동하는 버튼이있는 메인 메뉴 양식이 있습니다. 한 번에 각 하위 양식의 인스턴스 하나만 실행되기를 원했습니다. 또한 사용자가 이미 존재하는 하위 양식을 실행하려고 시도한 경우 하위 양식이되거나 다른 앱 창에있는 경우 "front & center"가 강제로 표시하고 싶었습니다. 현재 가장 많이 찬성 된 답변을 사용하여 답변을 다음과 같이 리팩토링했습니다.

private void btnOpenSubForm_Click(object sender, EventArgs e)
    {

        Form fsf = Application.OpenForms["formSubForm"];

        if (fsf != null)
        {
            fsf.WindowState = FormWindowState.Normal;
            fsf.Show();
            fsf.TopMost = true;
        }
        else
        {
            Form formSubForm = new FormSubForm();
            formSubForm.Show();
            formSubForm.TopMost = true;
        }
    }

if (Application.OpenForms["Form_NAME"] == null)
{
   new Form_NAME().Show();
}

양식 인스턴스가 열려 있지는 IF 루프에 들어갑니다.


이것은 나를 형성했습니다.

public void DetectOpenedForm()
{
    FormCollection AllForms = Application.OpenForms;
    Boolean FormOpen = false;
    Form OpenedForm = new Form();
    foreach (Form form in AllForms)
    {
        if (form.Name == "YourFormName")
        {
            OpenedForm = form;
            FormOpen = true;
        }
    }
    if (FormOpen == true)
    {
        OpenedForm.Close();
    }
}

내 방법이 가장 간단 하다고 생각합니다 .

    Form2 form2 = null;
    private void SwitchFormShowClose_Click(object sender, EventArgs e)
    {  
        if(form2 == null){
            form2 = new Form2();
            form2.Show();
        }
        else{
            form2.Close();
            form2 = null;
        }
    }

아래는 실제로 매우 잘 작동합니다.

private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e)
{
    var _open = false;
    FormCollection fc = Application.OpenForms;
    foreach (Form frm in fc)
    {
        if (frm.Name == "FormBrowseNetworkInformation")
        {
            _open = true;
            frm.Select();
            break;
        }
    }
    if (_open == false)
    {
        var formBrowseNetworkInformation = new FormBrowseNetworkInformation();
        formBrowseNetworkInformation.Show();
    }
}

확실히 확실히 말할 것입니다. 나도이 기능을 사용한다.

  public static bool isFormOpen(Form formm)
    {

        foreach (Form OpenForm in Application.OpenForms)
        {
            if (OpenForm.Name == formm.Name)
            {
                return true;
            }
        }

        return false;
    }

내가 미국 이전 게시물을 수정했습니다. 이것은 모든 열린 양식을 반복 할 필요없이 완벽하게 작동합니다.

        Form fc = Application.OpenForms["FormBrowse"];
        if (fc != null)
        {
            fc.Select();
        }
        else
        {
            var formBrowse = new FormBrowse();
            formBrowse.Show();
        }

또한 이것은 도움이 될 수 있습니다.


class Helper
    {
        public void disableMultiWindow(Form MdiParent, string formName)
        {
            FormCollection fc = Application.OpenForms;
            try
            {
                foreach (Form form in Application.OpenForms)
                {
                    if (form.Name == formName)
                    {
                        form.BringToFront();
                        return;
                    }
                }

                Assembly thisAssembly = Assembly.GetExecutingAssembly();
                Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First();
                Form myProgram = (Form)Activator.CreateInstance(typeToCreate);
                myProgram.MdiParent = MdiParent;
                myProgram.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }

참고 URL : https://stackoverflow.com/questions/3861602/how-to-check-if-a-windows-form-is-already-open-and-close-it-if-it-is

반응형