2009-07-10 31 views
5

Tôi đang sử dụng chức năng này để đóng biểu mẫu hiện có và mở biểu mẫu mới.Tìm biểu mẫu đang mở trong ứng dụng C# windows

Nếu không có hình thức ngoại lệ, nó sẽ phát ra lỗi.

Lỗi:

Target: System.Object MarshaledInvoke (System.Windows.Forms.Control, System.Delegate, System.Object [], Boolean)

nhắn: Gọi hoặc BeginInvoke không thể được gọi vào một điều khiển cho đến khi tay cầm cửa sổ được tạo ra.

Stack: tại System.Windows.Forms.Control.MarshaledInvoke (Control gọi, Đại Diện phương pháp, Object [] args, Boolean đồng bộ)

SO cần phải kiểm tra xem có bất kỳ hình thức mở trước khi đóng cửa các hình thức để tránh sự lỗi. Làm sao?

static public void NewMainForm(Form main, bool ClosePreviousMain) 
    { 
      if (main != null) 
      { 
       Global.ActiveForm = main.Text; 
       if (ClosePreviousMain & MyContext.curMain != null) 
       { 
        MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed); 
        //Need to check for any form active and then close the form. 
        MyContext.curMain.Invoke(new Action(MyContext.curMain.Dispose)); 
       } 
       MyContext.curMain = main; 
       MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed); 
       MyContext.curMain.ShowDialog(); 
      } 
    } 

Trả lời

5
if (ApplicationFormStatus.CheckIfFormIsOpen("FormName")) 
{ 
// It means it exists, so close the form 
} 

public bool CheckIfFormIsOpen(string formname) 
     { 

      //FormCollection fc = Application.OpenForms; 
      //foreach (Form frm in fc) 
      //{ 
      // if (frm.Name == formname) 
      // { 
      //  return true; 
      // } 
      //} 
      //return false; 

      bool formOpen= Application.OpenForms.Cast<Form>().Any(form => form.Name == formname); 

      return formOpen; 
     } 

Tôi đã dán hai phương pháp đơn giản nhất và phương thức thứ hai là LINQ.

1

Nếu bạn biết tên của biểu mẫu bạn cũng có thể làm như thế này:

var frm = Application.OpenForms.Cast<Form>().Where(x => x.Name == "MyForm").FirstOrDefault(); 
if (null != frm) 
{ 
    frm.Close(); 
    frm = null; 
} 
2

này một phần của tìm kiếm mã cho ví dụ hiện của một hình thức nếu chỉ tồn tại cho thấy nó, và nếu không tạo ra một ví dụ về số điện thoại

 `foreach (Form form in Application.OpenForms) 
     { 
      if (form.GetType() == typeof(myMainform)) 
      { 
       form.Activate(); 
       form.Show(); 
       this.Close(); 
       return; 
      } 
     } 

     myMainform m = new myMainform(); 
     m.Show();` 
Các vấn đề liên quan