2012-04-26 41 views
15

Tôi có một hộp thoại mà tôi muốn ngăn chặn khi đóng nút OK, nhưng nó trả về, và rằng ngay cả khi thuộc tính AcceptButton được đặt thành không thay vì của tôi Nút OK. Cách tốt nhất để ngăn chặn việc đóng cửa là gì?Ngăn chặn ShowDialog() quay lại khi nhấn nút OK

Trả lời

30

Thực tế bạn đang thay đổi thuộc tính sai. Bạn chắc chắn muốn AcceptButton là nút OK. Thuộc tính này xác định đó là nút mặc định trong điều khoản của Windows. Đó là nút được nhấn khi bạn nhấn ENTER trên bàn phím của bạn. Bằng cách thay đổi AcceptButton, bạn chỉ cần phá giao diện bàn phím cho hộp thoại của mình. Bạn không bị ảnh hưởng theo bất kỳ cách nào xảy ra khi nhấn nút.

Những gì bạn cần làm là đặt thuộc tính DialogResult của nút thành DialogResult.None vì đó là điều xác định liệu nút bấm có đóng biểu mẫu hay không. Sau đó, bên trong trình xử lý nhấp chuột của nút, bạn cần quyết định cách phản hồi nút nhấn. Tôi hy vọng rằng, nếu xác thực hộp thoại thành công, bạn nên đóng hộp thoại bằng cách đặt thuộc tính DialogResult của biểu mẫu. Ví dụ:

private void OKbuttonClick(object sender, EventArgs e) 
{ 
    if (this.CanClose()) 
     this.DialogResult = DialogResult.OK; 
} 
1

Bạn cần phải xóa DialogResult của chính nút đó, trong cửa sổ thuộc tính trên nút đặt thành None.

http://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx

Nếu DialogResult cho thuộc tính này được thiết lập để bất cứ điều gì khác hơn là Không, và nếu form cha được hiển thị thông qua các phương pháp ShowDialog , nhấp vào nút đóng form cha mà không cần bạn phải để treo lên bất kỳ sự kiện nào.

Rõ ràng, bây giờ nút của bạn sẽ không làm bất cứ điều gì, do đó bạn cần phải đăng ký trình xử lý cho sự kiện Click.

7

Cách tốt nhất để ngăn chặn hành vi này là thay đổi thuộc tính DialogResult của nút OK thành DialogResult.None trong cửa sổ thuộc tính tại thời điểm thiết kế.

Ngoài ra, nếu bạn đã có một số mã trong sự kiện nhấp chuột của nút OK, bạn có thể thay đổi biểu mẫu DialogResult.

private void comOK_Click(object sender, EventArgs e) 
{ 
    // your code ..... 

    // Usually this kind of processing is the consequence of some validation check that failed 
    // so probably you want something like this 
    if(MyValidationCheck() == false) 
    { 
     // show a message to the user and then stop the form closing with 
     this.DialogResult = DialogResult.None; 
    } 
} 
1

Cách tốt nhất là đặt nút Ok thành tắt thay vì không trả lời đầu vào của người dùng.

Thuộc tính DialogResult NÊN được đặt thành Ok hoặc Có tùy thuộc vào biểu mẫu và AcceptButton cũng phải được liên kết với Ok.

Tôi thường tạo một chức năng trên tất cả các hộp thoại và gọi nó bất cứ khi nào người dùng tương tác với dữ liệu.

void RefreshControls() { button.Enabled = this.ValidateInput(); }

-1
static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      Form2 fLogin = new Form2(); 
      if (fLogin.ShowDialog() == DialogResult.OK) 
      { 
       Application.Run(new Form1()); 
      } 
      else 
      { 
       Application.Exit(); 
      } 
     } 
    } 

public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void btnKlik_Click(object sender, EventArgs e) 
     { 
      this.DialogResult = DialogResult.OK; 
     } 
    } 

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
Các vấn đề liên quan