Domanda

Vorrei poter sovrascrivere il comportamento predefinito per posizionare il cursore in una casella di testo mascherata.

L'impostazione predefinita è posizionare il cursore in cui è stato fatto clic con il mouse, la casella di testo mascherata contiene già caratteri dovuti alla maschera.

So che puoi nascondere il cursore come menzionato in questo post , c'è qualcosa di simile per posizionare il cursore all'inizio della casella di testo quando il controllo viene messo a fuoco.

È stato utile?

Soluzione

Questo dovrebbe fare il trucco:

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

Altri suggerimenti

Per migliorare la soluzione di lavoro di Abbas, prova questo:

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

Questo gestore di eventi può essere riutilizzato con più caselle e non toglie la capacità dell'utente di posizionare il cursore nel mezzo dei dati immessi (ovvero non forza il cursore nella posizione zero quando la casella non è vuoto).

Trovo che questo imiti più da vicino una casella di testo standard. L'unica anomalia rimasta (che posso vedere) è che dopo l'evento 'Enter', l'utente è ancora in grado di selezionare il resto del prompt della maschera (vuoto) se xe tiene premuto il mouse e trascina fino alla fine.

Questo è un grande miglioramento rispetto al comportamento predefinito di MaskedTextBoxes. Grazie!

Ho apportato alcune modifiche all'eccellente soluzione di Ismaele. Preferisco chiamare BeginInvoke solo se il cursore deve essere spostato. Chiamo anche il metodo da vari gestori di eventi, quindi il parametro di input è il MaskedTextBox attivo.

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

Risposta parziale: è possibile posizionare il cursore assegnando una selezione di 0 lunghezze al controllo nell'evento MouseClick, ad esempio:

MaskedTextBox1.Select(5, 0)

... imposterà il cursore sulla posizione del 5 ° carattere nella casella di testo.

Il motivo per cui questa risposta è solo parziale, è perché non riesco a pensare a un modo generalmente affidabile per determinare la posizione in cui il cursore dovrebbe essere posizionato su un clic. Questo può essere possibile per alcune maschere, ma in alcuni casi comuni (ad esempio la maschera del numero di telefono degli Stati Uniti), non riesco davvero a pensare a un modo semplice per separare la maschera e richiedere i caratteri dall'input dell'utente reale ...

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

Questa soluzione funziona per me. Provalo per favore.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

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

Ho avuto il mio per funzionare usando l'evento Click .... non era necessario invocare.

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

Questa soluzione utilizza il metodo Click del MaskedTextBox come Gman Cornflake usato; tuttavia, ho trovato necessario consentire all'utente di fare clic all'interno del MaskedTextBox una volta che conteneva i dati e il cursore rimane dove si trova.

L'esempio seguente disattiva prompt e valori letterali e valuta la lunghezza dei dati in MaskedTextBox e se uguale a 0 posiziona il cursore nella posizione iniziale; altrimenti ignora semplicemente il codice che posiziona il cursore nella posizione iniziale.

Il codice è scritto in VB.NET 2017. Spero che questo aiuti!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top