2009-12-10 32 views
36

Tôi sử dụng C#. Tôi có Biểu mẫu Windows có hộp chỉnh sửa và nút Hủy. Hộp chỉnh sửa có mã trong sự kiện xác thực. Mã được thực hiện mỗi khi hộp chỉnh sửa bị mất tiêu điểm. Khi tôi nhấp vào nút Hủy, tôi chỉ muốn đóng biểu mẫu. Tôi không muốn bất kỳ xác nhận cho hộp chỉnh sửa được thực hiện. Làm thế nào điều này có thể được thực hiện?Cách bỏ qua Xác thực sau khi nhấp vào nút Hủy của biểu mẫu

Dưới đây là một chi tiết quan trọng: nếu xác nhận thất bại, sau đó

  e.Cancel = true; 

ngăn rời khỏi sự kiểm soát.

Nhưng khi người dùng nhấp vào nút Hủy, thì biểu mẫu sẽ bị đóng bất kể điều gì. làm thế nào điều này có thể được thực hiện?

+1

Không có gì bạn làm để nút Hủy sẽ ngăn mã Xác thực thực thi khi hộp văn bản của bạn bị mất tiêu điểm. – Stewbob

Trả lời

15

Đặt thuộc tính CausesValidation của nút Hủy thành false.

2

Đặt thuộc tính CausesValidation thành false.

1

Sử dụng hợp pháp tài sản Control.CausesValidation sẽ giúp bạn đạt được những gì bạn muốn.

39

Nếu xác thực xảy ra khi hộp chỉnh sửa bị mất tiêu điểm, không có gì về nút hủy sẽ ngừng điều đó xảy ra.

Tuy nhiên, nếu xác thực không thành công đang ngăn nút hủy thực hiện việc này, hãy đặt thuộc tính CausesValidation của nút thành false.

Reference: Button.CausesValidation property

+0

Không chắc chắn tại sao một người nào đó đã bỏ phiếu này. Đối với một ứng dụng winforms, nó là sự thật. Ba câu trả lời còn lại là không chính xác. – Stewbob

+0

Đó không phải là tôi: D –

+1

@DanielSchaffer: Tôi không chắc liệu tôi có hiểu chính xác "tuy nhiên" không. Làm thế nào tôi có thể ngăn chặn xác nhận từ diễn ra khi người dùng nhấn nút hủy bỏ? Việc xác thực kích hoạt một hộp thông báo luôn được hiển thị ngay cả khi người dùng muốn hủy chỉnh sửa/thêm đối tượng vì việc xác thực xảy ra trước khi nhấp vào nút. Tôi thậm chí đã cố gắng đặt 'CausesValidation = false' từ' MouseEnter' của 'BtnCancel' (không hoạt động). –

27

Rõ ràng CausesValidation tài sản của các nút phải được thiết lập để sai và sau đó là sự kiện xác nhận sẽ không bao giờ xảy ra trên nhấp chuột của nó. Nhưng điều này có thể thất bại nếu kiểm soát cha mẹ của nút có thuộc tính CausesValidation được đặt thành true. Hầu hết các nhà phát triển thời gian bỏ lỡ/quên thay đổi thuộc tính CausesValidation của điều khiển vùng chứa (như điều khiển bảng điều khiển). Đặt điều đó cũng thành False. Và điều đó sẽ làm được điều đó.

+4

Microsoft nên đặt giá trị 'Nguyên nhân xác thực' mặc định thành' False' cho vùng chứa vì chúng không tự lấy nét. –

+0

Nếu tôi có các thùng chứa lồng nhau, tôi có phải đặt nó thành 'False' tất cả các cách cho tất cả các vùng chứa hay chỉ là nút cha mẹ ngay lập tức của nút của tôi? – dotNET

+0

Ở đây một lần nữa sau một vài tháng :). Và sau này tôi đã tự tìm ra. Bạn không cần phải thiết lập tất cả các con đường lên cho tất cả các thùng chứa cha mẹ. Chỉ cần đặt cha mẹ ngay lập tức là đủ. – dotNET

2

Đặt nguyên nhânXác thực thành sai là khóa, tuy nhiên chỉ riêng điều này là không đủ. Nếu nút cha mẹ có CausesValidation được đặt thành true, sự kiện xác thực sẽ vẫn được gọi. Trong một trường hợp của tôi, tôi đã có một nút hủy bỏ trên một bảng điều khiển trên một biểu mẫu, vì vậy tôi đã phải đặt CausesValidation = false trên bảng điều khiển cũng như biểu mẫu. Cuối cùng tôi đã làm điều này programatically như nó đã được đơn giản hơn vì đi qua tất cả các hình thức ...

Control control = cancelButton; 

while(control != null) 
{ 
    control.CausesValidation = false; 
    control = control.Parent; 
} 
19

Tôi đã gặp vấn đề nhận thức của tôi phải đóng cửa, kể từ khi xác nhận kiểm soát nhất định là ngăn chặn nó. Tôi đã đặt control.CausesValidation = false cho nút hủy và tất cả phụ huynh của nút hủy. Nhưng vẫn còn có vấn đề.

Dường như nếu người dùng đang chỉnh sửa trường đang sử dụng xác thực và chỉ quyết định từ bỏ (để trường có đầu vào không hợp lệ), sự kiện nút hủy đã được kích hoạt nhưng cửa sổ sẽ không đóng cửa.

này đã được cố định bởi những điều sau đây trong trường hợp hủy bỏ nút bấm:

private void btnCancel_Click(object sender, EventArgs e) 
{ 
    // Stop the validation of any controls so the form can close. 
    AutoValidate = AutoValidate.Disable; 
    Close(); 
} 
+2

+1 để đơn giản. – Randy

0

Trong bổ sung của câu trả lời của Daniel Schaffer: nếu xác nhận xảy ra khi các hộp soạn thảo mất tập trung, bạn có thể forbid the button to activate để vượt qua địa phương xác nhận và thoát ra anyway.

public class UnselectableButton : Button 
{ 
    public UnselectableButton() 
    { 
     this.SetStyle(ControlStyles.Selectable, false); 
    } 
} 

hoặc nếu bạn sử dụng DevExpress:

this.simpleButtonCancel.AllowFocus = false; 

Lưu ý rằng làm như vậy sẽ làm thay đổi trải nghiệm bàn phím: tab sẽ tập trung nữa vào nút hủy.

3

Không có câu nào trong số những câu trả lời này hoàn toàn phù hợp với công việc, nhưng câu trả lời cuối cùng từ this thread. Về cơ bản, bạn cần phải:

  1. Đảm bảo rằng nút Cancel (nếu có) có .CausesValidation thiết lập là false
  2. Override phương pháp ảo này.

    protected override bool ProcessDialogKey(Keys keyData) { 
        if (keyData == Keys.Escape) { 
         this.AutoValidate = AutoValidate.Disable; 
         CancelButton.PerformClick(); 
         this.AutoValidate = AutoValidate.Inherit; 
         return true; 
        } 
        return base.ProcessDialogKey(keyData); 
    } 
    

Tôi không thực sự trả lời này, chỉ cần trỏ đến hai chàng trai thực sự đã làm.

0

Có thể bạn muốn sử dụng BackgroundWorker để có chút chậm trễ, vì vậy bạn có thể quyết định liệu xác thực có nên chạy hay không. Dưới đây là ví dụ về tránh xác thực khi đóng biểu mẫu.

// The flag 
    private bool _isClosing = false; 

    // Action that avoids validation 
    protected override void OnClosing(CancelEventArgs e) { 
     _isClosing = true; 
     base.OnClosing(e); 
    } 

    // Validated event handler 
    private void txtControlToValidate_Validated(object sender, EventArgs e) {   
     _isClosing = false; 
     var worker = new BackgroundWorker(); 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerAsync(); 
     worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
    } 

    // Do validation on complete so you'll remain on same thread 
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     if (!_isClosing) 
      DoValidationHere(); 
    } 

    // Give a delay, I'm not sure this is necessary cause I tried to remove the Thread.Sleep and it was still working fine. 
    void worker_DoWork(object sender, DoWorkEventArgs e) { 
     Thread.Sleep(100); 
    } 
-1

Tác phẩm này dành cho tôi.

private void btnCancelar_MouseMove(object sender, MouseEventArgs e) 
{ 
    foreach (Control item in Form.ActiveForm.Controls) 
    { 
     item.CausesValidation = false; 
    } 
} 
+3

Tại sao và như thế nào điều này làm việc cho bạn? – Unheilig

0

Ngay trên mã xác nhận vào hộp soạn thảo add:

if (btnCancel.focused) 
    { 
    return; 
    } 

Điều đó sẽ làm điều đó.

+0

Nó không làm điều đó cho tôi. –

0

Trong trường hợp của tôi, dưới hình thức tôi thiết lập thuộc tính AutoValidate để EnableAllowFocusChange

0

Bằng cách sử dụng Visual Studio Wizzard bạn có thể làm điều đó như thế:

enter image description here

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