Làm thế nào để kiểm tra xem một biểu mẫu cửa sổ đã được mở hay chưa và đóng nó nếu có?


79

Tôi có một biểu mẫu "fm" là một cửa sổ thông tin đơn giản mở ra sau mỗi 10 phút ( fm.Show();).

Làm thế nào tôi có thể thực hiện rằng cứ sau 10 phút, nó sẽ kiểm tra xem biểu mẫu "fm" có đang mở hay không và nếu nó đang mở, nó sẽ đóng nó và mở lại!

Bây giờ biểu mẫu fm luôn được tạo với form fm = new form();
vì vậy khi tôi cố gắng kiểm tra xem biểu mẫu có đang mở hay không, nó sẽ luôn là sai và mở một cửa sổ mới ngay cả khi đã có một biểu mẫu trước đó!

Tôi cần có một công cụ để cung cấp cho nó một danh tính duy nhất và sau đó kiểm tra xem biểu mẫu với danh tính duy nhất này có được mở hay không!

Tôi không muốn chỉ cập nhật dữ liệu trên biểu mẫu (fm), vì tôi có một thông tin phức tạp với các nút.

Tên biểu mẫu là "UpdateWindow"

Cảm ơn


1
Tại sao bạn muốn mở lại? Bạn muốn tạo phiên bản mới? Ý tôi là tại sao bạn không muốn gọi phương thức Show một lần nữa?
ngôn ngữ mặc định

xin chào, toàn bộ chương trình là một công cụ nội bộ trong công ty của chúng tôi để kiểm tra xem có bản cập nhật cho một trong các chương trình của chúng tôi hay không, nó hoạt động tốt, nhưng tôi cần đóng nó và mở lại vì nó nhận được thông tin cập nhật
Data-Base

2
Tại sao bạn không thêm thành phần Bộ hẹn giờ vào biểu mẫu và sử dụng bộ hẹn giờ để buộc cập nhật dữ liệu trong màn hình? Thậm chí tốt hơn, bạn có thể liên kết dữ liệu các điều khiển với một đối tượng để tự động cập nhật trạng thái.
Chris Thompson

2
Tôi Giải quyết nó bằng giải pháp này ... Form fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show (); vậy bạn nghĩ sao?
Cơ sở dữ liệu

Khai báo một đối tượng tĩnh toàn cục của kiểu biểu mẫu đó, gán đối tượng mới tạo cho đối tượng tĩnh đó. Khi xử lý, hãy đặt nó thành null. mỗi khi bạn tạo một biểu mẫu mới, trước tiên hãy kiểm tra đối tượng tĩnh có phải là rỗng hay không. Đây là giải pháp nhỏ gọn hơn bất kỳ giải pháp nào khác.
Lali

Câu trả lời:


92

có thể điều này sẽ giúp:

FormCollection fc = Application.OpenForms;

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

Một số mã trong foreach để phát hiện biểu mẫu cụ thể và nó có thể được thực hiện. Chưa được kiểm tra mặc dù.

Tìm thấy trên http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms


Cảm ơn, vậy làm thế nào để sử dụng nó với biểu mẫu của tôi (fm)?
Data-Base

if (frm là MyForm) {/ * * /}, nên thực hiện thủ thuật. Nhưng nếu nó chỉ để cập nhật, tại sao không gọi một phương thức để cập nhật dữ liệu?
Sascha

12
Tôi giải quyết nó bằng cái này .... Mẫu fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show ();
Cơ sở dữ liệu

1
Tôi gặp lỗi này sau khi đóng biểu mẫu bằng nó: System.InvalidOperationException: 'Bộ sưu tập đã được sửa đổi; hoạt động liệt kê có thể không thực hiện. '
noobsee

45

Tôi biết tôi đến muộn ... Nhưng đối với những người tò mò ... Đây là một cách khác

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

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

Sử dụng khuôn khổ tốt hơn nhiều so với imho câu trả lời được chấp nhận.
Gaspa79

14

Giả sử nếu chúng ta đang gọi một biểu mẫu từ một menu nhấp vào biểu mẫu MDI, thì chúng ta cần tạo khai báo cá thể của biểu mẫu đó ở cấp cao nhất như sau:

Form1 fm = null;

Sau đó, chúng ta cần xác định sự kiện nhấp vào menu để gọi Form1 như sau:

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

Các CheckOpened định nghĩa để kiểm tra Form1 đã được mở ra hay không:

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

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

Hy vọng điều này sẽ giải quyết các vấn đề về việc tạo nhiều phiên bản của biểu mẫu cũng tập trung vào Form1 khi nhấp vào menu nếu nó đã được mở hoặc thu nhỏ.


10

Tôi không chắc rằng tôi hiểu tuyên bố. Hi vọng điêu nay co ich. Nếu bạn chỉ muốn thao tác với một phiên bản của biểu mẫu này, bạn nên ngăn lệnh gọi Form.Dispose khi người dùng đóng. Để làm điều này, bạn có thể xử lý sự kiện Đóng của biểu mẫu con.

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

Và sau đó bạn không cần tạo các phiên bản mới của frm. Chỉ cần gọi phương thức Show trên phiên bản.

Bạn có thể kiểm tra thuộc tính Form.Vible để kiểm tra xem biểu mẫu có đang mở hay không.

private ChildForm form = new ChildForm();

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

Thực sự mình vẫn không hiểu sao bạn không cập nhật dữ liệu vào biểu mẫu.


điều này thật thú vị, nhưng làm thế nào tôi có thể xác định được biểu mẫu, ý tôi là chúng ta sử dụng biểu mẫu fm = new form (); vì vậy nó luôn là biểu mẫu mới, vậy làm thế nào tôi có thể xác định được biểu mẫu?
Cơ sở dữ liệu

Nếu nó chỉ là một dạng như vậy, bạn có thể tạo biến cấp lớp cho nó. Nếu có một rất nhiều hình thức tạo ra trong loạt các phương pháp, bạn tốt hơn sử dụng phương pháp Sascha của)
ngôn ngữ mặc định

1
Tôi giải quyết nó bằng cách kiểm tra xem biểu mẫu có mở theo tên hay không sau đó đóng nó nếu nó đang mở Mẫu fc = Application.OpenForms ["UpdateWindow"]; if (fc! = null) fc.Close (); fm.Show ();
Cơ sở dữ liệu

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

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

fc.Show();

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

Nó sẽ đóng biểu mẫu1, bạn có thể mở lại biểu mẫu đó nếu muốn bằng cách sử dụng:

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

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

nơi Form1là tên của mẫu của bạn.


1

Hãy thử điều này, nó sẽ hoạt động:

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

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

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

Nếu thể hiện biểu mẫu không được mở, nó sẽ đi vào vòng lặp IF.


1

thử hàm MDICHILD này

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

0

Cố gắng nối dây bên dưới,

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

Bằng cách nối dây sự kiện trên, nó sẽ cho bạn biết bất cứ khi nào biểu mẫu được thu nhỏ, ẩn một phần / toàn bộ bởi một biểu mẫu khác.


0

Đây là những gì tôi đã sử dụng để đóng tất cả các biểu mẫu đang mở (ngoại trừ biểu mẫu chính)

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

0

Thật buồn cười, tôi đã phải thêm vào chủ đề này.

1) Thêm var toàn cục trên form.show () và xóa var trên form.close ()

2) Trên biểu mẫu mẹ thêm bộ đếm thời gian. Giữ cho biểu mẫu con luôn mở và cập nhật dữ liệu của bạn sau mỗi 10 phút.

3) đặt bộ đếm thời gian trên biểu mẫu con để tự cập nhật dữ liệu.


0

* Hy vọng Điều này sẽ làm việc cho bạn

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

0

thử đi

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

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

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Cũng hãy cố gắng không chèn mã của bạn bằng các nhận xét giải thích, vì điều này làm giảm khả năng đọc của cả mã và giải thích!
Tạm biệt StackExchange,

0

Biểu mẫu chỉ một lần

Nếu mục tiêu của bạn là cho phép nhiều phiên bản của một biểu mẫu, hãy xem xét sau ...

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

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

Hãy thử Đây là ý tưởng ngắn để kiểm tra Biểu mẫu mở hay không mở


0

Trong ứng dụng của mình, tôi có một biểu mẫu menu chính có các nút để điều hướng đến một loại biểu mẫu khác (còn gọi là biểu mẫu phụ). Tôi chỉ muốn một phiên bản của mỗi biểu mẫu con chạy tại một thời điểm. Ngoài ra, tôi muốn đảm bảo nếu người dùng cố gắng khởi chạy biểu mẫu phụ đã tồn tại, biểu mẫu phụ sẽ buộc phải hiển thị "phía trước & trung tâm" nếu được thu nhỏ hoặc phía sau các cửa sổ ứng dụng khác. Sử dụng các câu trả lời được ủng hộ nhiều nhất hiện nay, tôi đã cấu trúc lại câu trả lời của họ thành câu này:

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

0

Tôi đã làm việc này:

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

Remenber để thêm thông tin về những gì bạn đang làm trên mã của bạn
xsami

0

Tôi nghĩ rằng phương pháp của tôi là đơn giản nhất .

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

0

Bên dưới thực sự hoạt động rất tốt.

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

Cảm ơn bạn vì đoạn mã này, đoạn mã có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích thích hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự khác. Hãy chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện
Shawn C.

0

điều này sẽ từ chắc chắn. tôi cũng sử dụng chức năng này cho bản thân.

  public static bool isFormOpen(Form formm)
    {

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

        return false;
    }

0

Tôi đã chỉnh sửa một bài đăng trước đó mà tôi đã thực hiện. Điều này hoạt động hoàn hảo mà không cần phải lặp lại mặc dù tất cả các biểu mẫu mở.

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

0

hãy thử điều này, không cần phải lặp qua các biểu mẫu:

if(Application.OpenForms["<your_form_name>"] != null){

   //Your form is already open

}
else {

  //Your form isn't open

}

0

Điều này hoạt động nếu bạn muốn Kiểm tra xem Biểu mẫu thứ hai đã được Mở chưa và tránh mở lại khi Click vào mông.

 int formcheck = 0;
    private void button_click()
    {
       Form2Name myForm2 = new Form2Name();
       if(formcheck == 0)
       {
          myForm2.Show(); //Open Form2 only if its not active and formcheck == 0
          // Do Somethin

          formcheck = 1; //Set it to 1 indicating that Form2 have been opened
       {   
    {

-1

Ngoài ra, có thể điều này sẽ giúp


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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.