Frage

Ich habe eine Textbox, die nicht zulassen sollten keine Sonderzeichen eingeben.

Der Benutzer kann ein:

  1. A-Z
  2. a-z
  3. 0-9
  4. Space

Wie kann ich das KeyDown Ereignis, dies zu tun?

War es hilfreich?

Lösung

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

Andere Tipps

das KeyDown oder KeyPress Ereignisse Handhabung ist ein Weg, dies zu tun, aber Programmierer in der Regel vergessen, dass ein Benutzer kann immer noch ungültigen Text in das Textfeld kopieren und einfügen.

Ein etwas besserer Weg ist das Textchanged-Ereignis zu behandeln, und den Streifen gibt keine problematischen Zeichen. Dies ist ein wenig komplizierter, wie Sie den Überblick über die Cursor-Position zu halten haben und wieder stellen Sie es auf die entsprechende Stelle nach dem Feld Eigenschaft Text zu ändern.

Je nach Anwendung Bedürfnisse, würde ich nur den Benutzertyp lassen in was auch immer sie wollen, und markieren Sie dann das Textfeld (drehen Sie den Text rot oder etwas), wenn der Benutzer vorlegen will.

Ich wollte nur einen Code für die hier durch Suche enden hinzuzufügen:

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

Dies ist ein Wechselfilter, so Griffe Kopieren und Einfügen, und bewahrt Position Cursor so, dass der Text in der Mitte ändert funktioniert.

Beachten Sie den ‚Absender‘ verwendet die Steuer Namen zu erhalten, so dass diese eine Funktion, um mehrere Textboxen verknüpft werden, müssen sie den gleichen Filter übernehmen. Sie können mehrere Kontrollen verknüpfen, indem Sie auf das Ereignis Abschnitt einer Kontrolle gerät und manuell die Funktion für das Textchanged-Ereignis Kommissionierung.

einen regulären Ausdruck Verwenden Sie die anderen Zeichen auszufiltern. Oder verwenden Char.IsDigit, IsXXX Methoden unerwünschte Zeichen auszufiltern. Viele Möglichkeiten, dies zu tun.

Update: Wenn Sie KeyDown verwenden müssen, dann scheint es, dass Sie müssen auch KeyPressed Griff und setzen obEventArgs.Handled = true die Zeichen nicht zulassen. Siehe Beispiel auf dem KeyDown- MSDN Seite

Update: Nun, da Sie angeben, es ist WPF. Der Code unten ermöglicht nur a-z und A-Z-Zeichen in das Textfeld eingegeben werden. Extend nach Bedarf ...

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

Dies wird brechen, wenn Sie Sachen in den Text-Box-Paste kopieren. Bestätigen Sie den gesamten Text, sobald der Benutzer das Steuerelement verlässt oder wenn er auf OK klickt / Senden als MusicGenesis sagt.

Ich denke, es lohnt sich angesichts tun die Filterung auf das Textchanged-Ereignis des TextBox. Sie können einen Vorgang erstellen, die von allen nicht-gültigen Zeichen aus der Textzeichenfolge entledigt. Das ist ein bisschen mehr chaotisch als das KeyDown-Ereignis blockiert wird.

Aber, ich denke, das ist der Weg zu gehen, weil Sie nicht WPF-interne KeyDown / Up Event-Handling-Mechanismen zu blockieren, so Kopieren / Einfügen funktioniert immer noch. Sie würden auf einer höheren Ebene der Abstraktion arbeiten, so denke ich, es wird einfacher sein, um herauszufinden, was los ist.

Ich lief in diese in Silver und schrieb so etwas wie diese.

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

ich erreichen dies mit einer benutzerdefinierten Abhängigkeitseigenschaft. Es ist wiederverwendbar für jede TextBox Steuerung ist viel schneller und effizienter als der Bau Schlüsselereignisse zu verwenden, und macht meine Code-Dateien viel sauberer.

Darüber hinaus kann es andere Eingabemethoden behandeln, die keine Schlüsselereignisse auslöst, wie einen Wert in das Textfeld einfügen mit der Maus.

Der Code für die benutzerdefinierte DP sieht wie folgt aus:

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

Und es wird benutzt, um wie folgt aus:

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

Ich weiß, dass WinForms eine MaskedTextBox Kontrolle zur Verfügung haben, die Sie genau diese Art der Sache angeben können. Ich weiß nicht, WPF, so dass ich weiß nicht, ob, dass es verfügbar ist, aber wenn es ist, tun. Es ist viel einfacher, als alle diese Dinge mit Drücken von Tasten und Veranstaltungen, und auch robuster.

Der einfachste Weg, dies zu tun wäre, um die Extended WPF Toolkit enthalten, die eine Kontrolle hat genau für das, was Sie fordern, indem eine Maske angeben.

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

Es wird auch die Maske in dem Textfeld angezeigt werden, wie Sie, wenn erforderlich sind, eingegeben werden.

(es auch viele andere nützliche Kontrollen hat)

und Ihre regExp könnten so aussehen [0-9a-zA-Z] * nur Englisch alphanumerischen chracters ermöglichen

nur alphanumerische TextBox WPF C #,

sorry für mein Englisch .. aber mit diesem Code für WPF, c #, ich nur alphanumerische erlauben

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

Verwenden Asp.NET AJAX Control Toolkit

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

Und Verwenden 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>

in my.Net Framework 4.5 C # Anwendung

    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;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top