17

特殊文字の入力を禁止するテキスト ボックスがあります。

ユーザーは次を入力できます。

  1. AZ
  2. から
  3. 0-9
  4. スペース

KeyDownこれを行うイベントをどのように作成できますか?

4

13 に答える 13

31

KeyDown または KeyPress イベントを処理することはこれを行う 1 つの方法ですが、プログラマーは通常、ユーザーが無効なテキストをテキスト ボックスにコピー アンド ペーストできることを忘れています。

もう少し良い方法は、TextChanged イベントを処理し、そこにある問題のある文字を取り除くことです。ボックスの Text プロパティを変更した後、キャレットの位置を追跡し、適切な場所に再設定する必要があるため、これはもう少し複雑です。

アプリケーションのニーズに応じて、ユーザーが必要なものを入力できるようにし、ユーザーが送信しようとしたときにテキスト ボックスにフラグを立てる (テキストを赤くするなど) ようにします。

于 2009-05-26T11:11:46.187 に答える
21

検索でここにたどり着く人のために、いくつかのコードを追加したかっただけです。

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

これは変更フィルターであるため、コピーと貼り付けを処理し、カーソル位置を保持して、途中でテキストを変更しても適切に機能するようにします。

「送信者」を使用してコントロール名を取得することに注意してください。これにより、同じフィルターが必要であると仮定して、この 1 つの関数を複数のテキスト ボックス ボックスにリンクできます。コントロールのイベント セクションに移動し、TextChanged イベントの関数を手動で選択することにより、複数のコントロールをリンクできます。

于 2014-03-13T15:08:17.880 に答える
9

正規表現を使用して、他の文字を除外します。または、Char.IsDigit、IsXXX メソッドを使用して不要な文字を除外します。これを行う方法はたくさんあります。

更新: KeyDown を使用する必要がある場合は、KeyPressed も処理し、obEventArgs.Handled = true を設定して文字を禁止する必要があるようです。KeyDown MSDN ページの例を参照してください。

更新: これで WPF を指定できました。以下のコードは、az および A ~ Z 文字のみをテキスト ボックスに入力できるようにします。必要に応じて延長...

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

テキストボックスに何かをコピーして貼り付けると、これが壊れます。ユーザーがコントロールを離れるか、MusicGenesis が言うように [OK/送信] をクリックしたときに、テキスト全体を検証します。

于 2009-05-26T10:50:35.043 に答える
3

私はシルバーライトでこれに遭遇し、このようなものを書きました。

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;
        }
    }
}
于 2013-01-30T21:24:04.397 に答える
3
private void _txtPath_KeyDown(object sender, KeyEventArgs e)
  {
     if ((e.Key < Key.A) || (e.Key > Key.Z))
        e.Handled = true;
  }
于 2009-07-28T03:51:11.227 に答える
3

I think it's worth considering doing the filtering on the TextBox's TextChanged event. You can create an operation that gets rid of any non-valid characters from your text string. This is a bit more messy than blocking the KeyDown event.

But, I think this is the way to go because you are not blocking WPF's built-in KeyDown/Up event handling mechanisms, so copy/paste still works. You would be working at a higher level of abstractions so I think it will be easier to figure out what is going on.

于 2009-05-26T13:15:43.330 に答える
3

カスタム依存関係プロパティを使用してこれを実現します。あらゆるTextBoxコントロールで再利用可能で、キー イベントを作成するよりもはるかに高速かつ効率的に使用でき、コード ファイルがよりクリーンになります。

さらに、マウスを使用して TextBox に値を貼り付けるなど、キー イベントをトリガーしない他の入力方法を処理できます。

カスタム DP のコードは次のようになります。

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

そして、次のように使用されます。

<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged}" 
         local:TextBoxHelpers.AllowedCharactersRegex="a-zA-Z0-9\s" />
于 2014-03-13T16:11:18.130 に答える
2

これを行う最も簡単な方法は、マスクを指定することで、求めていることを正確に実行するためのコントロールを持つ拡張 WPF ツールキットを含めることです。

http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=ホーム

また、必要に応じて、入力中にテキスト ボックスにマスクが表示されます。

(他にも便利なコントロールがたくさんあります)

于 2011-10-14T15:22:50.273 に答える
2

winForms には MaskedTextBox コントロールがあり、このようなことを正確に指定できることを知っています。私はWPFを知らないので、そこで利用できるかどうかはわかりませんが、利用できる場合はそうしてください。キープレスとイベントを使用したこれらすべてのものよりもはるかに簡単で、堅牢でもあります。

于 2009-05-26T11:59:14.453 に答える
1

英数字のみ TextBox WPF C#、

私の英語で申し訳ありません..しかし、WPF、c#のこのコードでは、英数字のみを許可します

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;
  }
}
于 2011-12-07T17:10:36.250 に答える
1

正規表現は [0-9a-zA-Z]* のようになり、英語の英数字のみを許可します

于 2009-05-26T11:53:11.953 に答える
0

Asp.NET AJAX コントロール ツールキットを使用する

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

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>
于 2014-04-05T07:10:28.770 に答える
0

my.Net Framework 4.5 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;
        }
    }
于 2015-06-24T13:22:43.740 に答える