2012-11-15 15 views
6

Tôi có 3 biểu mẫu trong ứng dụng C# của tôi - Form1, Form2 và Form3. Hiện tại khi ứng dụng của tôi bắt đầu tải lên Form1. Tôi muốn tất cả ba hình thức để mở khi khởi động ứng dụng.Hiển thị nhiều biểu mẫu khi ứng dụng C# bắt đầu

tôi đã cố gắng làm điều này trong Program.cs:

static void Main() 
{  
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
    Application.Run(new Form2()); 
} 

nhưng Form2 chỉ xuất hiện sau khi Form1 được đóng lại.

Làm cách nào để có thể làm cho cả 3 biểu mẫu hiển thị đồng thời ngay khi ứng dụng bắt đầu?

Trả lời

10

Bắt đầu các biểu mẫu khác từ sự kiện Form.Load của Form1.

private void Form1_Load(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2(); 
    form2.Show(); 
} 
+0

Điều duy nhất với điều này là, làm sao anh biết khi nào chương trình đóng? Theo người dùng, anh ta có thể đóng cửa sổ bất kỳ lúc nào. –

+0

@DJBurb Ông ấy chỉ định hành vi đóng mong muốn ở đâu? Nếu ứng dụng kết thúc khi * tất cả * 3 được đóng lại, khi * bất kỳ * 3 nào bị đóng, hoặc khi một biểu mẫu cụ thể bị đóng? Một, hoặc bất kỳ, đều dễ dàng. Tất cả sẽ là một công việc nhiều hơn nữa. – Servy

+0

Tôi nghĩ rằng bạn cần phải tìm ra chính mình, nhưng bạn có thể sử dụng ['Form.FormClosing'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing. aspx) sự kiện để tìm thấy khi một hình thức là beeing đóng cửa, hủy bỏ đóng cửa và ẩn các hình thức thay thế. Khi tất cả các biểu mẫu bị ẩn, hãy đóng ứng dụng. –

-2

bạn cũng có thể sử dụng 3 Tabs whit một hình thức Thay vì 3 hình thức

16

Nói chung, đúng cách để có ứng dụng của bạn làm điều gì đó khác hơn so với mặc định (mở một hình thức, chờ đợi cho nó để đóng, sau đó thoát) là tạo một lớp kế thừa từ ApplicationContext. Sau đó, bạn chuyển một thể hiện của lớp của bạn đến phương thức Application.Run. Khi ứng dụng đóng, hãy gọi ExitThread() từ trong lớp học của bạn.

Trong trường hợp này, bạn có thể tạo các phiên bản của ba biểu mẫu khi ứng dụng tải và đăng ký trình xử lý cho các sự kiện Closed của họ. Khi mỗi biểu mẫu được đóng lại, trình xử lý sẽ kiểm tra xem có bất kỳ biểu mẫu nào khác vẫn mở và nếu không sẽ đóng ứng dụng.

The example on MSDN đang làm hai điều:

  1. mở nhiều hình thức và thoát khỏi ứng dụng khi tất cả chúng đều đóng
  2. tiết kiệm kích thước cuối cùng và vị trí của các hình thức khi mỗi hình thức được đóng lại.

Một ví dụ đơn giản, trong đó đóng ứng dụng chỉ sau khi tất cả các hình thức đóng cửa:

class MyApplicationContext : ApplicationContext { 
    private void onFormClosed(object sender, EventArgs e) { 
     if (Application.OpenForms.Count == 0) { 
      ExitThread(); 
     } 
    } 

    public MyApplicationContext() { 
     //If WinForms exposed a global event that fires whenever a new Form is created, 
     //we could use that event to register for the form's `FormClosed` event. 
     //Without such a global event, we have to register each Form when it is created 
     //This means that any forms created outside of the ApplicationContext will not prevent the 
     //application close. 

     var forms = new List<Form>() { 
      new Form1(), 
      new Form2(), 
      new Form3() 
     }; 
     foreach (var form in forms) { 
      form.FormClosed += onFormClosed; 
     } 

     //to show all the forms on start 
     //can be included in the previous foreach 
     foreach (var form in forms) { 
      form.Show(); 
     } 

     //to show only the first form on start 
     //forms[0].Show(); 
    } 
} 

Sau đó, lớp Program của bạn trông như thế này:

static class Program { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MyApplicationContext()); 
    } 
} 

Ứng dụng này đóng cửa Logic có thể rõ ràng là được tùy chỉnh - là bất kỳ biểu mẫu nào vẫn mở hoặc chỉ một trong ba loại này hoặc chỉ ba phiên bản đầu tiên (yêu cầu giữ tham chiếu đến ba phiên bản đầu tiên, có thể là trong List<Form>).

sự kiện toàn cầu cho mỗi lần tạo biểu mẫu - this có vẻ đầy hứa hẹn.

Ví dụ tương tự here.

+0

Câu trả lời được chấp nhận là sai. Nó làm cho form1 trở thành dạng chì. Điều này cho phép mỗi biểu mẫu trở thành ứng dụng cho đến khi tất cả được xóa. Race-Điều kiện nói về sẽ có khả năng không bao giờ xảy ra, đặt một đối tượng khóa xung quanh tuyên bố loại bỏ nếu bạn hoàn toàn phải lo lắng về nó. – jerrylagrou

+1

Bởi vì các hình thức được tạo ra trên cùng một luồng, không có điều kiện chủng tộc. Xử lý sự kiện giao diện người dùng xảy ra tuần tự trên chuỗi giao diện người dùng. –

-1

Tôi đã tìm thấy giải pháp của mình bằng cách sửa đổi một chút câu trả lời của Zev Spitz.

Lưu ý: Phiên bản này chỉ bắt đầu biểu mẫu đầu tiên được chỉ định trong danh sách Biểu mẫu.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 

class MyApplicationContext : ApplicationContext 
{ 
    public List<Form> Forms = new List<Form>() { 
     new Form1() 
    }; 

    private List<Form> FormCollectionToList(FormCollection fc) 
    { 
     List<Form> ff = new List<Form>(); 
     foreach (Form f in fc) 
     { 
      ff.Add(f); 
     } 
     return ff; 
    } 

    private void onFormClosed(object sender, EventArgs e) 
    { 
     Forms = FormCollectionToList(Application.OpenForms); 
     if (Forms.Count == 0) 
     { 
      ExitThread(); 
     } 
     foreach (var form in Forms) 
     { 
      form.FormClosed -= onFormClosed; 
      form.FormClosed += onFormClosed; 
     } 
    } 

    public MyApplicationContext() 
    { 
     if (Forms.Count == 0) 
     { 
      Process.GetCurrentProcess().Kill(); 
     } 
     Forms[0].FormClosed += onFormClosed; 
     Forms[0].Show(); 
    } 
} 

Và phiên bản này bắt đầu tất cả chúng.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 

class MyApplicationContext : ApplicationContext 
{ 
    public List<Form> Forms = new List<Form>() { 
     new Form1() 
    }; 

    private List<Form> FormCollectionToList(FormCollection fc) 
    { 
     List<Form> ff = new List<Form>(); 
     foreach (Form f in fc) 
     { 
      ff.Add(f); 
     } 
     return ff; 
    } 

    private void onFormClosed(object sender, EventArgs e) 
    { 
     Forms = FormCollectionToList(Application.OpenForms); 
     if (Forms.Count == 0) 
     { 
      ExitThread(); 
     } 
     foreach (var form in Forms) 
     { 
      form.FormClosed -= onFormClosed; 
      form.FormClosed += onFormClosed; 
     } 
    } 

    public MyApplicationContext() 
    { 
     if (Forms.Count == 0) 
     { 
      Process.GetCurrentProcess().Kill(); 
     } 
     foreach (var form in Forms) 
     { 
      form.FormClosed += onFormClosed; 
      form.Show(); 
     } 
    } 
} 
+0

Bạn không cần hàm 'FormsCollectionToList'. Bạn có thể viết 'var openForms = Application.OpenForms.Cast

() .ToList();'. –

+0

Ngoài ra, điểm nào trong việc kiểm tra 'Forms.Count' trong hàm tạo? Khi nào nó sẽ là 0? –

+0

Việc bạn sử dụng 'Application.OpenForms' cho thấy có thể loại bỏ trường' List 'riêng tư. Xem câu trả lời cập nhật của tôi. –

Các vấn đề liên quan