2008-09-23 43 views
19

Tôi muốn có thể ghi đè hành vi mặc định để định vị dấu mũ trong hộp văn bản có mặt nạ.Định vị dấu mũ trong một MaskedTextbox

Giá trị mặc định là đặt dấu mũ khi con chuột được nhấp vào, hộp văn bản được đeo mặt nạ đã chứa các ký tự do mặt nạ.

Tôi biết rằng bạn có thể ẩn dấu nhắc như được đề cập trong post này, có điều gì đó tương tự để định vị dấu mũ ở đầu hộp văn bản khi điều khiển được lấy tiêu điểm hay không.

Trả lời

26

này nên làm như lừa:

private void maskedTextBox1_Enter(object sender, EventArgs e) 
    { 
     this.BeginInvoke((MethodInvoker)delegate() 
     { 
      maskedTextBox1.Select(0, 0); 
     });   
    } 
+1

Ahh, vì vậy bạn cần sử dụng BeginInvoke! Tôi đã thử điều này mà không làm như vậy và cuối cùng không thấy bất kỳ thay đổi nào. +1 – Jeremy

+0

Tại sao bạn cần sử dụng BeginInvoke? – Vaccano

+0

@vaccano - nó làm việc cho tôi mà không có BeginInvoke –

3

câu trả lời từng phần: bạn có thể xác định vị trí dấu sót bằng cách gán một lựa chọn 0-chiều dài để kiểm soát trong trường hợp mouseclick, ví dụ:

MaskedTextBox1.Select(5, 0) 

. .. sẽ đặt dấu mũ ở vị trí ký tự thứ 5 trong hộp văn bản.

Lý do câu trả lời này chỉ là một phần, là vì tôi không thể nghĩ ra một cách đáng tin cậy để xác định vị trí mà dấu mũ nên được đặt trên một lần nhấp. Điều này có thể xảy ra đối với một số mặt nạ, nhưng trong một số trường hợp phổ biến (ví dụ như mặt nạ số điện thoại của Hoa Kỳ), tôi không thể nghĩ ra một cách dễ dàng để tách riêng mặt nạ và ký tự ... Điện thoại

9

để cải tiến giải pháp làm việc của Abbas, hãy thử này:

private void ueTxtAny_Enter(object sender, EventArgs e) 
{ 
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it. 
    MaskedTextBox textBox = sender as MaskedTextBox; 

    if (textBox != null) 
    { 
     this.BeginInvoke((MethodInvoker)delegate() 
     { 
      int pos = textBox.SelectionStart; 

      if (pos > textBox.Text.Length) 
       pos = textBox.Text.Length; 

      textBox.Select(pos, 0); 
     }); 
    } 
} 

xử lý sự kiện này có thể được tái sử dụng với nhiều hộp, và nó không lấy đi khả năng của người dùng để đặt con trỏ vào giữa dữ liệu nhập vào (tức là không ép con trỏ vào vị trí 0 khi hộp không trống.

Tôi thấy điều này để bắt chước chặt chẽ hơn một hộp văn bản chuẩn. Chỉ có trục trặc còn lại (mà tôi có thể thấy) là sau khi sự kiện 'Enter', người dùng vẫn có thể chọn phần còn lại của dấu nhắc mặt nạ (trống) nếu xe giữ chuột và kéo đến cuối.

+0

Cảm ơn bạn đã chỉnh sửa chút ít. Đúng thứ tôi cần. –

+0

Bạn có thể phục vụ với cùng mã với việc sử dụng nó cho cả hai chức năng Nhập và Nhấp cho Maskedtextbox :) – Mobin

6

Đó là một cải tiến lớn so với hành vi mặc định của MaskedTextBoxes. Cảm ơn!

Tôi đã thực hiện một vài thay đổi đối với giải pháp tuyệt vời của Ishmaeel. Tôi thích gọi BeginInvoke chỉ khi con trỏ cần được di chuyển. Tôi cũng gọi phương thức từ các trình xử lý sự kiện khác nhau, do đó tham số đầu vào là MaskedTextBox đang hoạt động.

private void maskedTextBoxGPS_Click(object sender, EventArgs e) 
{ 
    PositionCursorInMaskedTextBox(maskedTextBoxGPS); 
} 


private void PositionCursorInMaskedTextBox(MaskedTextBox mtb) 
{ 
    if (mtb == null) return; 

    int pos = mtb.SelectionStart; 

    if (pos > mtb.Text.Length) 
    this.BeginInvoke((MethodInvoker)delegate() { mtb.Select(mtb.Text.Length, 0); }); 
} 
+0

Tôi thích câu trả lời này là tốt nhất - +1. Ngoài ra, nó làm việc cho tôi mà không có BeginInvoke. Điều đó có lẽ chỉ cần thiết nếu bạn định nghĩa PositionCursorInMaskedTextBox như một phương thức trợ giúp có thể được gọi bất cứ nơi nào trong chương trình của bạn. –

3
//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control 
private void txtAccount_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (txtAccount.SelectionStart > txtAccount.Text.Length) 
    txtAccount.Select(txtAccount.Text.Length, 0); 
} 
0

Giải pháp này làm việc cho tôi. Hãy thử một lần.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 

maskedTextBox1.Select(maskedTextBox1.Text.Length, 0); 
} 
0

Tôi đã bắt đầu sử dụng sự kiện nhấp .... không có yêu cầu.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 
    maskedTextBox1.Select(0, 0);    
} 
Các vấn đề liên quan