2011-08-23 41 views

Trả lời

17

Điều đó hoàn toàn bình thường, vì đó là hành vi dự định. Tuy nhiên, nó không tương đương với việc nhấp vào chữ "X" màu đỏ ở góc trên cùng bên phải của Biểu mẫu nếu bạn đang sử dụng MDI hoặc ShowDialog().

Khi một hình thức được hiển thị như một hộp thoại modal, nhấp vào Đóng nút (nút có dấu X ở góc trên cùng bên phải của mẫu) làm cho hình thức để được ẩn và tài sản DialogResult để được đặt thành DialogResult.Cancel. Phương thức Đóng không được tự động gọi là khi người dùng nhấp vào nút Đóng của hộp thoại hoặc đặt giá trị của thuộc tính DialogResult. Thay vào đó, biểu mẫu bị ẩn và có thể được hiển thị lại mà không cần tạo một phiên bản mới của hộp thoại. Do hành vi này, bạn phải gọi phương thức Vứt bỏ theo mẫu khi đơn đăng ký của bạn không còn cần thiết nữa.

Giá trị DialogResult thể được ghi đè mặc dù:

Bạn có thể ghi đè giá trị được gán cho tài sản DialogResult khi người dùng nhấp vào nút Close bằng cách thiết lập thuộc tính DialogResult trong phương thức thụ lý sự kiện cho Đóng sự kiện của biểu mẫu.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=VS.100).aspx

+0

Có bất kỳ tài liệu nào mô tả hành vi bình thường, dự định của phương thức Close() đặt giá trị DialogResult thành Hủy không? – Fernando

+0

Không phải là tôi có thể tìm thấy. Tuy nhiên, sự khác biệt duy nhất giữa Close() và nhấp vào nút đóng, là biểu mẫu không được xử lý nếu các điều kiện trên được đáp ứng. Điều đó có nghĩa là việc gán cho DialogResult là như nhau (Cancel). Nếu bạn cần nó là None, nó có thể được ghi đè bằng cách sử dụng phương thức trên. –

24

Hoặc thậm chí dễ dàng hơn, bạn có thể thiết lập DialogResult ngay sau khi Close. Ví dụ: giả sử ValidateSettings sẽ hiển thị cho người dùng bất kỳ sự cố nào với biểu mẫu hoặc trả về true bằng cách khác:

private void btnOK_Click(object sender, EventArgs e) 
    { 
     if (ValidateSettings()) 
     { 
      SaveSettings(); 
      Close(); 
      DialogResult = DialogResult.OK; 
     } 
    } 
+0

Lưu ý: Trong WPF bạn không thể thay đổi 'Window.DialogResult' sau khi biểu mẫu được đóng lại. –

+1

@ Zéiksz - OK, nhưng đây là một câu hỏi Winforms và mã là một câu trả lời Winforms mà tôi đã thử nghiệm trong môi trường đó. Người ta cũng có thể bỏ phiếu vì nó không hoạt động trên Ruby on Rails, nhưng điều đó có vẻ hơi bất công. Hoặc tôi đang thiếu một cái gì đó bởi vì tôi đã làm việc trong Java quá lâu. :) –

+0

Tôi đã không downvote hoặc một cái gì đó ... chỉ cần lưu ý một số thông tin WPF. Bit offtopic, có, nhưng phần mở rộng hữu ích cho câu trả lời của bạn cho những người đang thực sự nghiên cứu trong câu hỏi này (như tôi đã làm, và nghĩ rằng những người khác có thể sử dụng thông tin quá - ngay tại đây). Tôi xin lỗi nếu bạn lấy nó như là hành vi phạm tội, nói như vậy và tôi loại bỏ các bình luận. –

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