2012-03-09 18 views
8

Có cách nào để tìm hiểu xem các "TextChanged" Sự kiện này được sa thải vìLàm thế nào để tìm hiểu xem "TextChanged" Sự kiện này được bắn nếu người dùng đang gõ vào một textbox hoặc myTextBox.Text được gọi là lập trình

  1. người dùng đang nhập vào hộp văn bản hoặc
  2. lập trình viên được gọi là myTextBox.Text = "something"?

Chỉ cần để cung cấp cho bạn một số màu sắc về vấn đề này, tôi không muốn phản ứng khi người dùng gõ từng chữ cái vào textbox vì vậy tôi đang sử dụng "Validated" sự kiện để đón khi người dùng được thực hiện vì vậy tôi có thể phản ứng. Vấn đề là tôi không có cách nào để bắt khi lập trình viên làm "myTextbox.Text =" cái gì đó ". Cách duy nhất tôi biết để nắm bắt các thay đổi là sử dụng TextChanged nhưng sau đó tôi không muốn phản ứng khi sử dụng là đánh máy mỗi chữ cái vào textbox. Bất kỳ lời đề nghị?

+0

?? không phải là người lập trình dưới sự kiểm soát của bạn? – vulkanino

+1

Ngữ cảnh mà bạn cần để xác thực đầu vào của lập trình viên cho hộp văn bản của bạn như thế nào? Không nên lập trình viên biết đầu vào hợp lệ là gì và kiểm tra trước khi thiết lập văn bản thành một cái gì đó? Việc xác thực đơn giản có thể được thêm vào thuộc tính myTextbox.Text (ghi đè thuộc tính Văn bản mặc định) cũng như nếu bạn không muốn kiểm tra được thực hiện ở mỗi vị trí trong mã nơi văn bản được đặt. – jzworkman

+0

Tôi đang tạo hộp văn bản "Định dạng" sẽ hiển thị văn bản trong hộp văn bản với chuỗi định dạng khi văn bản của hộp văn bản được nhập (như mặt nạ nhưng có thể tùy chỉnh hơn) – Denis

Trả lời

6

Tôi đoán rằng bạn đang tích hợp UserControl mà các nhà phát triển khác sẽ sử dụng, do đó người lập trình "người dùng cuối" có thể đặt văn bản theo chương trình. Tôi nghĩ rằng điều đơn giản nhất là làm theo gợi ý của @ jzworkman và tạo một lớp ghi đè lên trình thiết lập thuộc tính Text. Như ghi chú @vulkanino, bạn có thể tăng và nắm bắt sự kiện Xác thực.

public class TextBoxPlus : TextBox { 
    public event CancelEventHandler ProgrammerChangedText; 
    protected void OnProgrammerChangedText(CancelEventArgs e) { 
     CancelEventHandler handler = ProgrammerChangedText; 
     if (handler != null) { handler(this, e); } 
    } 

    public override string Text { 
     get { 
      return base.Text; 
     } 
     set { 
      string oldtext = base.Text; 
      base.Text = value; 
      CancelEventArgs e = new CancelEventArgs(); 
      OnProgrammerChangedText(e); 
      if (e.Cancel) base.Text = oldtext; 
     } 
    } 
} 

Trong nguồn của bạn, thêm bộ xử lý tương tự cho cả hai sự kiện Validating và ProgrammerChangedText:

// Somewhere... 
textBoxPlus1.Validating += textBoxPlus1_Validating; 
textBoxPlus1.ProgrammerChangedText += textBoxPlus1_Validating; 

void textBoxPlus1_Validating(object sender, CancelEventArgs e) { 
    decimal d; 
    if (!Decimal.TryParse(textBoxPlus1.Text, out d)) { 
     e.Cancel = true; 
    } 
} 
+0

Tôi không biết tại sao ai đó downvoted bạn vì vậy tôi đã thêm một upvote vì đây là một cũng nghĩ ra câu trả lời và giới hạn mã tái sử dụng – jzworkman

+1

Tại sao downvote? Điều này thực hiện chính xác những gì mà OP yêu cầu. –

+0

Đây là cách tôi đã đi đến cùng với RaiseEvent (giống như @jzworkman với tính năng "RaiseEvent"). Ước gì tôi có thể đánh dấu cả hai là câu trả lời. Cảm ơn bạn. – Denis

-3
// This is the manual way, which is an alternative to the first way. 
// Type 'this.TextChanged += ' into your form's constructor. 
// Then press TAB twice, and you will have a new event handler. 
this.TextChanged += new EventHandler(textBox1_TextChanged); 

void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    //put the logic here for your validation/requirements for validation 
    // ex. if (textbox1.Text=="something") {//don't validate} 
    // 
} 
+0

Điều này sẽ được gọi mỗi lần người dùng nhập một ký tự mới vào hộp văn bản mà OP không muốn. Anh ta muốn khi thuộc tính 'myTextbox.Text' được đặt thành một cái gì đó mới. – jzworkman

-2

Nếu bạn muốn thực hiện xác nhận, sử dụng các sự kiện Validating, không phải là Validated (mà đến khi nó là quá muộn để hành động).

Điều đó nói rằng, số thực sự là cần ở đây?

Sự kiện xác thực được cung cấp một đối tượng kiểu CancelEventArgs. Nếu bạn xác định rằng dữ liệu của kiểm soát không hợp lệ, bạn có thể hủy sự kiện xác thực bằng cách đặt thuộc tính Hủy của đối tượng này thành true. Nếu bạn không đặt thuộc tính Hủy, Windows Forms sẽ giả định rằng xác thực đã thành công cho điều khiển đó và tăng sự kiện đã xác thực.

(http://msdn.microsoft.com/en-us/library/ms229603.aspx)

+0

Xác thực/Xác thực sự kiện KHÔNG kích hoạt khi bạn đang làm myTextBox.Text = "cái gì đó" để điều này không hoạt động. – Denis

8

Vì vậy, trong "Formatted" Textbox lớp học của bạn:

public override String Text{ 
    get{return text;} 
    set 
    { 
     //perform validation/formatting 
     this.text = formattedValue; 
    } 

này nên cho phép bạn định dạng văn bản khi nó được thay đổi bởi một lập trình viên, xác thực đầu vào người dùng sẽ vẫn cần phải được xử lý trong sự kiện xác nhận hợp lệ.

+0

Chính xác! Thật đơn giản, không nghĩ về nó ... Không biết tại sao mọi người lại đánh dấu điều này ... Đây chính là điều tôi đang tìm kiếm - nhìn vào các sự kiện là sai - tôi cần điều chỉnh bộ não của mình thành một và xem xét các thuộc tính/phương pháp ghi đè. – Denis

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