2010-02-22 61 views
62

Trong đơn đăng ký của tôi, tôi muốn hiển thị biểu mẫu đăng nhập trước và sau đó là biểu mẫu chính nếu đăng nhập thành công. Hiện tại tôi đang làm điều gì đó như sau:Sự khác nhau giữa Application.Run() và Form.ShowDialog() là gì?

var A = new LoginForm(); 
if (A.ShowDialog() == DialogResult.OK) 
    Application.Run(new MainForm()); 

Nhưng sau đó tôi bắt đầu tự hỏi - điểm của Application.Run() là gì? Tại sao không chỉ làm (new MainForm()).ShowDialog()? Có gì khác biệt? Và điều gì sẽ là cách chính xác để đạt được những gì tôi muốn?

Trả lời

54

Application.Run(Form) bắt đầu vòng lặp tin nhắn trên chuỗi hiện tại và hiển thị biểu mẫu được chỉ định. Vòng lặp tin nhắn cho phép biểu mẫu nhận tin nhắn Windows (ví dụ: nhấn phím, bấm chuột, vô hiệu hóa sơn) để cho phép nó xuất hiện phản hồi và tương tác với người dùng. Khi bạn gọi ShowDialog() trên một ví dụ Form, nó thực sự thực hiện một điều tương tự và tạo một vòng lặp thông báo phương thức cho biểu mẫu mà trên đó ShowDialog đã được gọi.

Không có nhiều sự khác biệt giữa hai cuộc gọi. Application.Run không thêm một số xử lý sự kiện bổ sung cho phép bạn làm một số dọn dẹp các tài nguyên khi biểu mẫu chính bị đóng (xem).

Cách được khuyến nghị để khởi động ứng dụng WinForms đang sử dụng Application.Run, nhưng tôi nghi ngờ đây là quy ước hơn quy tắc. Lý do lớn nhất để sử dụng Application.Run là nếu bạn muốn mở nhiều biểu mẫu không theo phương thức. Bạn có thể làm điều này bằng:

new Form().Show(); 
new Form().Show(); 
Application.Run(); 

Bạn không thể đạt được điều này bằng cách sử dụng phương pháp ShowDialog() là một trong những hình thức sẽ phải được phương thức.


Đối với câu hỏi của bạn như thế nào để hiển thị một hình thức đăng nhập và sau đó là hình thức chính nếu đăng nhập thành công, tôi nghĩ rằng những gì bạn có là tốt:

if (new LoginForm().ShowDialog() == DialogResult.OK) 
{ 
    Application.Run(new MainForm()); 
} 

Cách khác là để làm tự sửa ống nước và mở một phiên bản MainForm trong sự kiện đóng của LoginForm nếu thông tin đăng nhập thành công.

+0

Vì vậy, điều này có nghĩa là bạn có thể có một vòng lặp tin nhắn trên cùng một chủ đề như hai hình thức trong khi có thể xử lý ba riêng biệt? – SomeNickName

1

Application.Run() là để bắt đầu đăng ký trong khi MainForm là một phần của ứng dụng và MainForm()).ShowDialog() chỉ được sử dụng để hiển thị nó.

Application.Run()entry point cho Đơn đăng ký của bạn. giống như phương thức Main() dành cho một số lớp hoặc ApplicationStart() cho một ứng dụng web

Application.Run() có các tình trạng quá tải khác nhau, một trong số đó không có tham số. Phương thức đó bắt đầu ứng dụng mà không có biểu mẫu ban đầu.

+1

Vì vậy, tất cả những gì có nghĩa là trong điều kiện tôi nên chọn? Cho đến nay có vẻ như với tôi rằng cả hai cách làm việc tốt. Nhưng phải có một số khác biệt tinh tế, phải không? –

4

Từ MSDN:

Phương pháp này cho biết thêm một event handler để tham số MainForm cho Closed sự kiện. Trình xử lý sự kiện gọi ThoátThử để xóa ứng dụng .

http://msdn.microsoft.com/en-us/library/ms157902.aspx

+5

Đó có phải là sự khác biệt đáng chú ý không? Tôi đã kiểm tra với Reflector và có vẻ như có rất nhiều thứ xảy ra đằng sau hậu trường phụ thuộc vào cái nào được gọi. Chắc chắn có một số khác biệt tinh tế hơn, mặc dù tôi không thể nói điều gì - mã phản chiếu khá khó hiểu. –

+0

Tôi chỉ tìm thấy một người điên, và tôi đến đây trong khi googling để xem nếu có ai có thể giải thích tại sao: Tôi đã dành một giờ làm việc ngày hôm nay cố gắng tìm ra lý do tại sao this.Hide(), và this.Visible = false, trên của tôi hình thức, cả hai thực sự đóng cửa các hình thức hơn là giấu nó. Tôi hoàn toàn bối rối. Rõ ràng có một số khác biệt - hoàn toàn có thể tái tạo! - nơi form.ShowDialog() thực hiện điều này, nhưng Application.Run() thực hiện điều mong đợi. Có vấn đề gì với điều đó? (Tôi đoán ý tưởng là, bởi vì nó là phương thức, nếu nó không bao giờ được hiển thị, nó giả định bạn muốn đóng nó.) – neminem

2

Một khác biệt chính là ShowDialog thường là một Dialog phương thức. Nếu bạn muốn tạo một bộ công cụ thân thiện với người dùng, bạn sẽ không muốn nó bao gồm các hộp thoại phương thức.

Ngoài ra, Application.Run() chấp nhận nhiều hơn một biểu mẫu. Nó có một vài tình trạng quá tải.

Đối với ứng dụng của bạn, tôi không nghĩ rằng nó quan trọng. Application.Run có ý nghĩa với tôi bởi vì nó biểu thị sự khởi đầu của ứng dụng thực tế của bạn.

+0

Vì nó là hình thức chính của tôi, nó không quan trọng nếu nó là một Dialog Modal, không? –

+0

Điều đó là chính xác. –

5

Từ thử nghiệm của tôi, tôi nhận thấy sự khác biệt chính này:

Khi Application.Run được sử dụng, nút Close của form (X màu đỏ) trả DialogResult.None; tuy nhiên, khi sử dụng ShowDialog, nút Đóng sẽ tạo ra DialogResult.Cancel.

Điều này có quan trọng với bạn không? Trong mã của tôi, tôi đã kiểm tra DialogResult.Cancel để xác định mã thoát của ứng dụng của tôi. Điều đó đã bị hỏng khi X màu đỏ được sử dụng để đóng biểu mẫu. Bây giờ tôi kiểm tra DialogResult.OK để chỉ ra một lối ra thành công.

 return myForm.DialogResult == DialogResult.OK ? 0 : 1; 
+0

Điều này là do Application.Run sử dụng Biểu mẫu.Hiển thị() –

2

Các documentation of the overload

public static void Run(
    ApplicationContext context); 

có một ví dụ gọn gàng với một cách tiếp cận khác nhau có liên quan đến hai hình thức là tốt.

+1

Mẹo hay. Thật không may nó đã không giúp tôi khi tôi sử dụng WinCE. – Oren

2

Đối với một ví dụ concerete nhiều hơn một sự khác biệt:

Nếu hình thức chính của bạn là một hình thức MDI, sau đó hành vi trên cách nhấn vào nút close ('x' ở bên phải phía trên, hoặc Alt-F4) là khác nhau tùy thuộc vào phương pháp bạn sử dụng để hiển thị biểu mẫu.

Với Application.Run(mainForm), sự kiện đóng của các biểu mẫu con chạy, khi đó sự kiện đóng biểu mẫu chính sẽ chạy.

Với mainForm.ShowDialog, sự kiện đóng của biểu mẫu chính sẽ chạy và sự kiện đóng của biểu mẫu con không chạy.

0

Từ thử nghiệm của tôi, tôi nhận thấy rằng bằng cách sử dụng các nút Application.Run với DialogResult không đóng biểu mẫu (OnFormClosing không được nhấn) so với ShowDialog trong đó các nút với DialogResult nhấn OnFormClosing và đóng biểu mẫu.

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