2009-11-02 33 views
8

Tôi không nhận được hành vi tôi mong đợi cho một TextBox bị ràng buộc vào một tài sản số nguyên trong một đối tượng kinh doanh.Hủy kiểm soát dữ liệu kiểm soát sự kiện không ngăn chặn cố gắng cập nhật nguồn dữ liệu

Dưới đây là những gì tôi đã làm:

(1) Thiết lập DataSourceUpdateMode, cho TextBox để: OnValidation.

(2) Trong sự kiện Validating cho TextBox, đặt e.Cancel = True nếu Integer.TryParse không thành công.

(3) Thêm trình xử lý vào Binding.ParseBinding.BindingComplete và đặt điểm ngắt trong trình xử lý.

Chạy ứng dụng, đặt "asdasd" vào TextBox và tab. Mặc dù thiết lập e.Cancel = True, các sự kiện ParseBindingComplete đều được nâng lên. Theo tài liệu, việc đặt e.Cancel = True sẽ ngăn chặn bất kỳ logic nào khác.

Tôi đã tìm kiếm MSDN để tìm hiểu lý do tại sao điều này xảy ra nhưng tôi không thể tìm thấy bất kỳ điều gì. Có ai biết nơi tôi có thể có một số chi tiết về điều này?

ETA: Tôi cũng thêm một tay cầm vào sự kiện được xác thực. Đây là chuỗi sự kiện:

Dữ liệu không hợp lệ:

(1) Xác thực. (Tôi đặt e.Cancel = True)

(2) Phân tích

(3) BindingComplete

Tốt dữ liệu:

(1) xác nhận hiệu lực

(2) Phân tích

(3) BindingComplete

(4) Đã xác thực

ETA2: Thông tin thêm một chút và công việc xung quanh.

Sự cố với hành vi này là nếu bạn có một số xác thực không được triển khai trong trình thiết lập thuộc tính. Ví dụ:

Ví dụ: giả sử thuộc tính số nguyên của tôi phải là một số lẻ. Tôi không kiểm tra điều này trong setter tài sản, vì vậy tôi làm kiểm tra trong sự kiện xác nhận.

Như bạn có thể thấy, từ hành vi trên, giá trị, dưới dạng số nguyên hợp pháp, sẽ được ghi vào nguồn dữ liệu, ngay cả khi tôi hủy xác thực.

Mặc dù nguồn dữ liệu được cập nhật, nếu bạn đặt Hủy trong sự kiện xác thực, sự kiện đã xác thực sẽ không bị kích hoạt, vì vậy bạn vẫn có thể ngăn người dùng tiến hành.

Work-Khoảng ::

Để ngừng cập nhật nguồn dữ liệu, bạn cần phải xác nhận trong trường hợp Binding.Parse, và ném một ngoại lệ - đó ngăn chặn Ràng buộc từ hoàn thành thành công.

+0

tìm tốt. [Hình như một lỗi winforms] [1]. [1]: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=490267 –

+0

Chúc mừng, tôi đã bỏ phiếu và thêm một công việc. – Jules

Trả lời

1

Thêm cuộc gọi vào CancelEdit dường như tạo sự khác biệt.

private void textBox1_Validating(object sender, CancelEventArgs e) 
    { 
     bindingSource1.CancelEdit(); 
     e.Cancel = true; 
    } 
+0

Lần sau, tôi sẽ kiểm tra xem năm nào câu hỏi đã được đăng trong .... – helgeheldre

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