2009-05-26 16 views

risposta

2
private void _txtPath_KeyDown(object sender, KeyEventArgs e) 
    { 
    if ((e.Key < Key.A) || (e.Key > Key.Z)) 
     e.Handled = true; 
    } 
9

Utilizzare un'espressione regolare per filtrare gli altri caratteri. O utilizzare Char.IsDigit, metodi IsXXX per filtrare i caratteri indesiderati. Un sacco di modi per farlo.

Aggiornamento: Se è necessario utilizzare KeyDown, sembra che sia necessario gestire anche KeyPressed e impostare obEventArgs.Handled = true per disabilitare i caratteri. Vedere l'esempio su KeyDown MSDN Page

Aggiornamento: Ora si specifica che è WPF. Il codice seguente consentirà di inserire solo caratteri a-z e A-Z nella casella di testo. Estendere in base alle esigenze ...

private void _txtPath_KeyDown(object sender, KeyEventArgs e) 
     { 
     if ((e.Key < Key.A) || (e.Key > Key.Z)) 
      e.Handled = true; 
     } 

Questo si romperà se si copia-incolla roba nella casella di testo. Convalidare l'intero testo una volta che l'utente lascia il controllo o quando fa clic su OK/Invia come dice MusicGenesis.

+0

Può essere fatto nell'evento KeyDown? – Sauron

+3

Ho appena scoperto che potreste effettivamente confrontare i valori chiave con altri operandi che = = ... grazie mille, molto utile! – David

31

Gestione della KeyDown o eventi di pressione è un modo per fare questo, ma i programmatori di solito dimentichiamo che un utente può ancora copiare e incollare testo non valido nella casella di testo.

Un modo un po 'migliore è gestire l'evento TextChanged e rimuovere tutti i caratteri offensivi. Questo è un po 'più complicato, in quanto è necessario tenere traccia della posizione del cursore e reimpostarla nel punto appropriato dopo aver modificato la proprietà Text della casella.

A seconda delle esigenze dell'applicazione, vorrei semplicemente consentire all'utente di digitare quello che vogliono e quindi contrassegnare la casella di testo (trasformare il testo in rosso o qualcosa) quando l'utente tenta di inviare.

+4

+1 per menzionare l'utente "copia-incolla" nella casella di testo. – Joel

1

e la vostra espressione regolare potrebbe apparire come [0-9a-zA-Z] * per consentire solo chracters alfanumerici inglesi

2

so che WinForms hanno a disposizione un controllo MaskedTextBox, che consente di specificare esattamente questo genere di cose. Non conosco il WPF, quindi non so se è disponibile lì, ma se lo è, fallo. È MOLTO più facile di tutto questo con keypress ed eventi, e anche più robusto.

3

penso che sia opportuno prendere in considerazione di fare il filtraggio sulla evento TextChanged del controllo TextBox. È possibile creare un'operazione che elimina tutti i caratteri non validi dalla stringa di testo. Questo è un po 'più complicato del blocco dell'evento KeyDown.

Ma, penso che questa sia la strada da percorrere perché non si bloccano i meccanismi di gestione degli eventi KeyDown/Up incorporati di WPF, quindi copia/incolla funziona ancora. Lavoreresti ad un livello più alto di astrazioni, quindi penso che sarà più facile capire cosa sta succedendo.

2

Il modo più semplice per farlo sarebbe quello di incluso Extended Toolkit WPF, che dispone di un controllo per fare esattamente quello che stai chiedendo specificando una maschera.

http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=Home

Sarà anche visualizzare la maschera nella casella di testo, come si sta introducendo, se necessario.

(Ha anche molti altri controlli utili)

1

solo alfanumerico TextBox WPF C#,

dispiace per il mio inglese .. ma con questo codice per WPF, C#, ho solo permesso alfanumerico

private void txtTraslado_TextChanged(object sender, KeyEventArgs e) 
{ 
    if (((e.Key < Key.NumPad0)||(e.Key > Key.NumPad9))&&((e.Key < Key.A)||(e.Key > Key.Z))) 
    { 
    e.Handled = true; 
    } 
} 
3

Mi sono imbattuto in questo in argento e ha scritto qualcosa di simile.

private string _filterRegexPattern = "[^a-zA-Z0-9]"; // This would be "[^a-z0-9 ]" for this question. 
private int _stringMaxLength = 24; 


private void _inputTextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if (!string.IsNullOrEmpty(_filterRegexPattern)) 
    { 
     var text = _inputTextBox.Text; 
     var newText = Regex.Replace(_inputTextBox.Text, _filterRegexPattern, ""); 

     if (newText.Length > _stringMaxLength) 
     { 
      newText = newText.Substring(0, _stringMaxLength); 
     } 


     if (text.Length != newText.Length) 
     { 
      var selectionStart = _inputTextBox.SelectionStart - (text.Length - newText.Length); 
      _inputTextBox.Text = newText; 
      _inputTextBox.SelectionStart = selectionStart; 
     } 
    } 
} 
11

Volevo solo aggiungere del codice per coloro finire qui per ricerca:

private void Filter_TextChanged(object sender, EventArgs e) 
{ 
    var textboxSender = (TextBox)sender; 
    var cursorPosition = textboxSender.SelectionStart; 
    textboxSender.Text = Regex.Replace(textboxSender.Text, "[^0-9a-zA-Z ]", ""); 
    textboxSender.SelectionStart = cursorPosition; 
} 

Questo è un filtro cambiamento, in modo da maniglie copia e incolla, e conserva la posizione del cursore in modo che la modifica del testo in il centro funziona correttamente.

Nota utilizza il "mittente" per ottenere il nome del controllo, consentendo a questa funzione di essere collegata a più caselle di testo, presupponendo che abbiano bisogno dello stesso filtro. Puoi collegare più controlli andando alla sezione eventi di un controllo e selezionando manualmente la funzione per l'evento TextChanged.

+1

Ho finito per usare questo, grazie! –

3

Realizzo questo con una Proprietà Dipendenza personalizzata. È riutilizzabile per qualsiasi controllo , è molto più veloce ed efficiente da utilizzare rispetto alla creazione di eventi chiave e rende i miei file di codice molto più puliti.

Inoltre, può gestire altri metodi di input che non attivano eventi chiave, come ad esempio incollare un valore nel TextBox usando il mouse.

Il codice per il costume DP si presenta così:

// When set to a Regex, the TextBox will only accept characters that match the RegEx 

/// <summary> 
/// Lets you enter a RegexPattern of what characters are allowed as input in a TextBox 
/// </summary> 
public static readonly DependencyProperty AllowedCharactersRegexProperty = 
    DependencyProperty.RegisterAttached("AllowedCharactersRegex", 
             typeof(string), typeof(TextBoxProperties), 
             new UIPropertyMetadata(null, AllowedCharactersRegexChanged)); 

// Get 
public static string GetAllowedCharactersRegex(DependencyObject obj) 
{ 
    return (string)obj.GetValue(AllowedCharactersRegexProperty); 
} 

// Set 
public static void SetAllowedCharactersRegex(DependencyObject obj, string value) 
{ 
    obj.SetValue(AllowedCharactersRegexProperty, value); 
} 

// Events 
public static void AllowedCharactersRegexChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    var tb = obj as TextBox; 
    if (tb != null) 
    { 
     if (e.NewValue != null) 
     { 
      tb.PreviewTextInput += Textbox_PreviewTextChanged; 
      DataObject.AddPastingHandler(tb, TextBox_OnPaste); 
     } 
     else 
     { 
      tb.PreviewTextInput -= Textbox_PreviewTextChanged; 
      DataObject.RemovePastingHandler(tb, TextBox_OnPaste); 
     } 
    } 
} 

public static void TextBox_OnPaste(object sender, DataObjectPastingEventArgs e) 
{ 
    var tb = sender as TextBox; 

    bool isText = e.SourceDataObject.GetDataPresent(DataFormats.Text, true); 
    if (!isText) return; 

    var newText = e.SourceDataObject.GetData(DataFormats.Text) as string; 
    string re = GetAllowedCharactersRegex(tb); 
    re = string.Format("[^{0}]", re); 

    if (Regex.IsMatch(newText.Trim(), re, RegexOptions.IgnoreCase)) 
    { 
     e.CancelCommand(); 
    } 
} 

public static void Textbox_PreviewTextChanged(object sender, TextCompositionEventArgs e) 
{ 
    var tb = sender as TextBox; 
    if (tb != null) 
    { 
     string re = GetAllowedCharactersRegex(tb); 
     re = string.Format("[^{0}]", re); 

     if (Regex.IsMatch(e.Text, re, RegexOptions.IgnoreCase)) 
     { 
      e.Handled = true; 
     } 
    } 
} 

Ed è usato in questo modo:

<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged}" 
     local:TextBoxHelpers.AllowedCharactersRegex="a-zA-Z0-9\s" /> 
0

Usa Asp.NET AJAX Control Toolkit

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 

e Usa FilteredTextBoxExtender

<asp:TextBox ID="txt_gpf_no" runat="server" CssClass="textbox" 
               MaxLength="10"></asp:TextBox> 
<asp:FilteredTextBoxExtender ID="FilteredTextBoxExtender_gpf_no" runat="server" Enabled="True" 
               TargetControlID="txt_gpf_no" FilterType="UppercaseLetters,LowercaseLetters,Custom" ValidChars="1234567890 "> 
</asp:FilteredTextBoxExtender> 
0

in my.Net Framework 4.5 C# applicazione

private void txtRF_Register_Val_KeyDown(object sender, KeyEventArgs e) 
    { 
     //only enable alphanumeric 
     if (!(((e.KeyCode < Keys.NumPad0) || (e.KeyCode > Keys.NumPad9)) && ((e.KeyCode < Keys.A) || (e.KeyCode > Keys.E)))) 
     { 
      e.SuppressKeyPress = false; 
     } 
     else 
     { 
      e.SuppressKeyPress = true; 
     } 
    } 
Problemi correlati