2008-09-23 11 views
19

Chciałbym móc zastąpić domyślne zachowanie dla pozycjonowania karetki w zamaskowanym polu tekstowym.Ustawić karetkę w MaskedTextbox

Ustawieniem domyślnym jest umieszczenie karetki w miejscu, w którym kliknięto myszą, a maskowane pole tekstowe zawiera już znaki związane z maską.

Wiem, że można ukryć karetkę, jak wspomniano w tym post, czy jest coś podobnego do umieszczenia karetki na początku pola tekstowego, gdy kontrolka się skupi.

Odpowiedz

26

To powinno załatwić sprawę:

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

Ahh, więc musisz użyć BeginInvoke! Próbowałem tego nie robiąc tego i skończyło się na tym, że nie widziałem żadnej zmiany. +1 – Jeremy

+0

Dlaczego musisz używać BeginInvoke? – Vaccano

+0

@vaccano - działa dla mnie bez BeginInvoke –

3

częściową odpowiedź: można umieścić daszka przypisując wybór 0 długości do kontroli w przypadku kliknięcie myszką, np:

MaskedTextBox1.Select(5, 0) 

. ... ustawi karetkę na piątej pozycji znaku w polu tekstowym.

Powód, dla którego ta odpowiedź jest tylko częściowa, polega na tym, że nie mogę wymyślić ogólnie niezawodnego sposobu określania pozycji, w której karetka powinna być ustawiona na kliknięcie jako. To może być możliwe w przypadku niektórych masek, ale w niektórych typowych przypadkach (np. Maska numeru telefonu w USA), nie mogę naprawdę myśleć o łatwym sposobie oddzielenia maski od znaków zapytania od rzeczywistego wprowadzania danych przez użytkownika ...

9

aby ulepszyć roztworu roboczego Abbasa, spróbuj tego:

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); 
     }); 
    } 
} 

ten obsługi zdarzeń mogą być ponownie wykorzystane w wielu polach, a ona nie odbiera zdolność użytkownika, aby umieścić kursor w środku wprowadzonych danych (tzn. nie wymusza przesunięcia kursora do pozycji zerowej, gdy pudełko nie jest puste).

Uważam, że jest to dokładniejsze naśladowanie standardowego pola tekstowego. Pozostaje tylko usterka (widzę), że po zdarzeniu "Enter" użytkownik nadal może wybrać resztę (pustego) monitu, jeśli xe przytrzyma mysz i przeciągnie do końca.

+0

Dzięki za drobną korektę. Dokładnie to, czego potrzebowałem. –

+0

Możesz go obsłużyć tym samym kodem, używając go do funkcji Enter i Click dla Maskedtextbox :) – Mobin

6

To duża poprawa w stosunku do domyślnego zachowania MaskedTextBoxes. Dzięki!

Wprowadziłem kilka zmian w doskonałym rozwiązaniu Ishmaeela. Wolę wywoływać BeginInvoke tylko wtedy, gdy kursor wymaga przeniesienia. Również wywołuję metodę z różnych procedur obsługi zdarzeń, więc parametr wejściowy jest aktywnym MaskedTextBox.

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

Ta odpowiedź pasuje najlepiej - +1. Poza tym działa dla mnie bez BeginInvoke. Jest to prawdopodobnie potrzebne tylko wtedy, gdy definiujesz PositionCursorInMaskedTextBox jako metodę pomocniczą, którą można wywołać w dowolnym miejscu w twoim programie. –

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

Rozwiązanie to działa na mnie. Spróbuj, proszę.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 

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

Dostałem moje do pracy przy użyciu zdarzenia Click ... no Invoke było potrzebne.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 
    maskedTextBox1.Select(0, 0);    
}