2009-03-04 40 views
8

Tôi đã triển khai quy tắc xác thực trên một hộp văn bản trong WinForm của mình và nó hoạt động tốt. Tuy nhiên nó chỉ kiểm tra xác thực khi tôi thoát khỏi trường. Tôi muốn nó kiểm tra ngay sau khi bất cứ điều gì được nhập vào hộp và mỗi khi nội dung thay đổi. Ngoài ra tôi muốn nó để kiểm tra xác nhận ngay sau khi WinForm mở ra.Xác thực về thay đổi văn bản trong TextBox

Tôi nhớ đã thực hiện điều này khá gần đây bằng cách đặt một số sự kiện và điều gì đó, nhưng tôi dường như không thể nhớ cách thực hiện.

Trả lời

4

TextChanged

trong tương lai bạn có thể tìm thấy tất cả các sự kiện trên thư viện MSDN, đây là TextBox class reference:

http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox(VS.80).aspx

+0

Sự kiện TextChanged sẽ chỉ kích hoạt khi tiêu điểm đã bị mất khỏi điều khiển (chẳng hạn như từ một tab ra). Điều này sẽ chỉ ngăn không cho nhập dữ liệu không hợp lệ khi bạn rời khỏi. OP dường như muốn ngăn chặn nó từ bao giờ được phép. – TheTXI

+8

Điều đó không chính xác, các vụ cháy TextChanged bất kể trọng tâm là gì. –

+0

Tôi đã sửa chữa – TheTXI

1

Bạn nên kiểm tra các sự kiện KeyPress hoặc KeyDown và không chỉ sự kiện TextChanged của bạn.

Đây là một C# Ví dụ trực tiếp từ MSDN documentation: sự kiện

// Boolean flag used to determine when a character other than a number is entered. 
private bool nonNumberEntered = false; 

// Handle the KeyDown event to determine the type of character entered into the control. 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Initialize the flag to false. 
    nonNumberEntered = false; 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     // Determine whether the keystroke is a number from the keypad. 
     if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) 
     { 
      // Determine whether the keystroke is a backspace. 
      if(e.KeyCode != Keys.Back) 
      { 
       // A non-numerical keystroke was pressed. 
       // Set the flag to true and evaluate in KeyPress event. 
       nonNumberEntered = true; 
      } 
     } 
    } 
    //If shift key was pressed, it's not a number. 
    if (Control.ModifierKeys == Keys.Shift) { 
     nonNumberEntered = true; 
    } 
} 

// This event occurs after the KeyDown event and can be used to prevent 
// characters from entering the control. 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    // Check for the flag being set in the KeyDown event. 
    if (nonNumberEntered == true) 
    { 
     // Stop the character from being entered into the control since it is non-numerical. 
     e.Handled = true; 
    } 
} 
+0

tôi nghĩ rằng bạn shoud kiểm tra TextValueChanged là tốt, như ai đó chỉ đơn giản là có thể "Paste" chars bất hợp pháp :) –

+1

Phương pháp này sẽ không làm việc với Paste (nó sẽ chặn các tổ hợp phím CTRL-V nhưng nó sẽ không kiểm tra menu hộp văn bản "dán"). Bạn sẽ cần phải xử lý nó một cách riêng biệt. – xanatos

1

Dữ liệu của bạn sẽ hợp lệ như thế nào nếu nó không được hoàn thành? tức là người dùng nhập một số và bạn thử xác thực nó là một ngày?

+0

phỏng đoán của tôi là trường số không thể chứa chữ cái hoặc ngược lại – Jason

+1

Điều này khá phổ biến nếu bạn muốn ngăn mọi người nhập các ký tự không hợp lệ. Nếu bạn kiểm tra KeyPress hoặc KeyDown, bạn có thể bẫy đầu vào và giữ cho nó không bao giờ hiển thị. – TheTXI

+1

Đó là toàn bộ vấn đề. Dữ liệu không hợp lệ khi nó không bị kết thúc vì vậy chúng tôi muốn có lỗi xuất hiện bất cứ khi nào trường chứa dữ liệu không hợp lệ. Điều này bao gồm lúc khởi động và khi nhập miễn là dữ liệu không hợp lệ. – Sakkle

5

Nếu bạn đang sử dụng databinding, hãy chuyển đến Thuộc tính của hộp văn bản. Mở (DataBindings) ở trên cùng, bấm vào (nâng cao) tài sản, ba dấu chấm sẽ xuất hiện (...) Nhấp vào những người. Màn hình ràng buộc dữ liệu nâng cao xuất hiện. Đối với mỗi thuộc tính của TextBox bị ràng buộc, trong trường hợp của bạn Text, bạn có thể đặt khi databinding và do đó xác thực, nên "kick in" bằng cách sử dụng combobox Data Source Update mode. Nếu bạn đặt nó thành OnPropertyChanged, nó sẽ đánh giá lại khi bạn nhập (mặc định là OnValidation chỉ cập nhật dưới dạng tab của bạn).

+0

giải pháp nhanh nhất, dễ nhất và sạch nhất – Florian

1

Khi ràng buộc hộp văn bản của bạn vào một liên kếtSource đi tới Nâng cao và chọn loại xác thực
"Trên thuộc tính đã thay đổi". Điều này sẽ truyền dữ liệu của bạn đến thực thể của bạn trên mỗi lần nhấn phím. Here is the screen shot

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