2009-05-26 22 views

Odpowiedz

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

Użyj wyrażeń regularnych, aby odfiltrować pozostałe znaki. Lub użyj metod Char.IsDigit, IsXXX do odfiltrowania niechcianych znaków. Mnóstwo sposobów na zrobienie tego.

Aktualizacja: Jeśli musisz użyć KeyDown, wydaje Ci się, że musisz także obsługiwać KeyPressed i ustawić obEventArgs.Handled = true, aby nie zezwalać na znaki. Zobacz przykład aktualizacji: Teraz, gdy określasz to WPF. Poniższy kod umożliwi wpisywanie tylko znaków a-z i A-Z do pola tekstowego. Rozszerz w razie potrzeby ...

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

Spowoduje to zerwanie, jeśli skopiujesz i wkleisz elementy do pola tekstowego. Zatwierdź cały tekst, gdy użytkownik opuści kontrolę lub kliknie OK/Submit as MusicGenesis mówi.

+0

Czy można to zrobić w wydarzeniu KeyDown? – Sauron

+3

Właśnie odkryłem, że można porównać wartości klucza z innymi operandami niż = ... dzięki, bardzo przydatne! – David

31

Obsługa zdarzeń KeyDown lub KeyPress jest jednym ze sposobów, aby to zrobić, ale programiści zwykle zapominają, że użytkownik może nadal kopiować i wklejać nieprawidłowy tekst do pola tekstowego.

Nieco lepiej jest obsłużyć zdarzenie TextChanged i usunąć tam wszelkie obrażające znaki. Jest to nieco bardziej skomplikowane, ponieważ musisz śledzić pozycję karetki i ponownie ustawić ją w odpowiednim miejscu po zmianie właściwości Text pola.

W zależności od potrzeb aplikacji, po prostu pozwolę użytkownikowi wpisać cokolwiek zechce, a następnie zaznacz pole tekstowe (przekręć tekst na czerwono lub coś w tym stylu), gdy użytkownik spróbuje przesłać.

+4

+1 za dodanie do pola tekstowego "wklejania" przez użytkownika. – Joel

1

a REGEXP mógłby wyglądać [0-9a-zA-Z] *, aby umożliwić tylko angielskich chracters alfanumerycznych

2

wiem, że mają WinForms, dostępną regulację MaskedTextBox który pozwala określić dokładnie tego rodzaju rzeczy. Nie znam WPF, więc nie wiem, czy to tam jest dostępne, ale jeśli tak, zrób to. Jego DUŻO jest łatwiejsze niż wszystkie te rzeczy dzięki naciśnięciom klawiszy i wydarzeniom, a także bardziej niezawodne.

3

Myślę, że warto rozważyć wykonanie filtrowania w zdarzeniu TextCox TextChanged. Możesz utworzyć operację, która pozbędzie się wszelkich nieważnych znaków z twojego ciągu tekstowego. To jest trochę bardziej nieporządne niż zablokowanie zdarzenia KeyDown.

Ale myślę, że to jest sposób, aby przejść, ponieważ nie blokujesz wbudowanych mechanizmów obsługi zdarzeń KeyDown/Up WPF, więc kopiuj/wklej nadal działa. Pracowałbyś na wyższym poziomie abstrakcji, więc myślę, że łatwiej będzie zorientować się, co się dzieje.

1

tylko alfanumeryczny TextBox WPF C#,

przepraszam za mój angielski .. ale z tego kodu dla WPF, C#, ja tylko pozwalają alfanumeryczny

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

Wpadłem na to w srebrnym świetle i napisałem coś takiego.

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

Chciałem tylko dodać trochę kodu dla tych, kończący się tu kryteria:

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

Jest to filtr zmiana, więc uchwyty skopiuj i wklej, i zachowuje pozycję kursora tak, że zmiana tekstu w środek działa poprawnie.

Uwaga: używa nazwy "nadawcy" do uzyskania nazwy kontrolnej, umożliwiając połączenie tej jednej funkcji z wieloma polami tekstowymi, zakładając, że potrzebują tego samego filtru. Możesz połączyć wiele kontrolek, przechodząc do sekcji zdarzenia kontrolki i ręcznie wybierając funkcję zdarzenia TextChanged.

+1

Skończyło się na tym, dzięki! –

3

Osiągam to za pomocą niestandardowej właściwości zależności. Jest to narzędzie wielokrotnego użytku dla dowolnego kontrolera TextBox, jest znacznie szybsze i bardziej wydajne w użyciu niż tworzenie kluczowych zdarzeń i sprawia, że ​​moje pliki kodu są znacznie czystsze.

Ponadto obsługuje inne metody wprowadzania danych, które nie powodują zdarzeń kluczowych, takich jak wklejenie wartości do pola TextBox za pomocą myszy.

Kod dla zwyczaju DP wygląda następująco:

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

i jest stosowany tak:

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

Zastosowanie Asp.NET Ajax Control Toolkit

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

i obsługiwania 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

w my.Net ramowego 4.5 aplikacji C#

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; 
     } 
    } 
Powiązane problemy