سؤال

لدي مربع نص يجب عدم السماح بإدخال أي أحرف خاصة.

يمكن للمستخدم الدخول:

  1. az.
  2. az.
  3. 0-9
  4. الفراغ

كيف يمكنني صنع KeyDown الحدث للقيام بذلك؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

يعد معالجة أحداث Keydown أو KeyPress إحدى الطرق للقيام بذلك، لكن المبرمجين عادة ما ينسون أن المستخدم لا يزال بإمكانه نسخ النص غير صالح والمعجون في مربع النص.

طريقة أفضل إلى حد ما هي التعامل مع الحدث TextChanged، وتقدم أي شخصيات مخالفة هناك. هذا أكثر تعقيدا بعض الشيء، كما يتعين عليك تتبع موضع Caret وإعادة تعيينه إلى المكان المناسب بعد تغيير خاصية نص المربع.

اعتمادا على احتياجات التطبيق الخاصة بك، أود فقط السماح لنوع المستخدم في كل ما يريده، ثم ضع علامة على مربع النص (أدر النص الأحمر أو أي شيء) عندما يحاول المستخدم إرسال.

أردت فقط إضافة بعض الكود لأولئك الذين ينتهي هنا عن طريق البحث:

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

هذا عامل تصفية التغيير، لذلك يتعامل مع نسخ ولصق، وتحافظ على وضع المؤشر بحيث يؤدي تغيير النص في الأوسط بشكل صحيح.

ملاحظة يستخدم "المرسل" للحصول على اسم عنصر تحكم، مما يتيح توصيل هذه الوظيفة المرتبطة بعلاد مربعات نصية متعددة، على افتراض أنها بحاجة إلى نفس المرشح. يمكنك ربط عناصر تحكم متعددة عن طريق الانتقال إلى قسم الحدث من عنصر تحكم واختيار الوظيفة يدويا للحدث TextChanged.

استخدم Regex لتصفية الأحرف الأخرى. أو استخدم Char.isdigit، أساليب ISXXX لتصفية الأحرف غير المرغوب فيها. الكثير من الطرق للقيام بذلك.

قم بالتحديث: إذا كان يجب عليك استخدام Keydown، فيمكنك أن تحتاج أيضا إلى التعامل أيضا مع مقنعي وتعيين Obeventargs.handled = صحيح لعدم السماح بالأحرف. انظر المثال على صفحة MSDN Keydown.

تحديث: الآن أن تحدد WPF. سيسمح الرمز أدناه بإدخال الأحرف من الألف إلى الياء والحق في مربع النص. تمديد حسب الحاجة ...

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

هذا سوف ينكسر إذا قمت بنسخ الأشياء المعجونة في مربع النص. التحقق من صحة النص بأكمله بمجرد أن يترك المستخدم التحكم أو عند النقر فوق "موافق / إرسال" كما يقول موقع الموسيقى.

أعتقد أنه يستحق النظر في إجراء التصفية على حدث TextChanged TextBox. يمكنك إنشاء عملية تتخلص من أي أحرف غير صالحة من سلسلة النص. هذا هو أكثر فوضى قليلا من حجب حدث keydown.

ولكن، أعتقد أن هذه هي الطريقة التي يجب أن تذهب لأنك لا تحظر آليات معالجة الأحداث المضمنة في حدث WPF، لذلك نسخ / لصق لا يزال يعمل. سوف تعمل على مستوى أعلى من التجريدات، لذلك أعتقد أنه سيكون من الأسهل معرفة ما يجري.

ركضت في هذا في silverlight وكتب شيئا مثل هذا.

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

أنا أنجز هذا مع خاصية التبعية المخصصة. انها قابلة لإعادة الاستخدام لأي 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" />

أعلم أن Winforms لديها عنصر تحكم MaskedTextBox، مما يتيح لك تحديد هذا النوع من الأشياء بالضبط. لا أعرف WPF، لذلك أنا دون أن أوفي إذا كان ذلك متاحا، ولكن إذا كان كذلك، ففعل ذلك. أسهل بكثير من كل هذه الأشياء مع القيود والأحداث، وأكثر قوة أيضا.

إن أسهل طريقة للقيام بذلك ستكون لتضمين مجموعة أدوات WPF الموسعة التي لديها عنصر تحكم للقيام بالضبط ما تطلبه عن طريق تحديد قناع.

http://wpftoolkit.codeplex.com/wikipage؟ttle=maskedtextox&referringtitle=home.

سيعرض أيضا القناع في مربع النص كما كنت مسند إذا لزم الأمر.

(يحتوي أيضا على العديد من الضوابط الأخرى المفيدة)

ويمكن أن تبدو regexp الخاصة بك [0-9a-za-z] * للسماح فقط بالإنجليزية chracters الأبجدية الرقمية

فقط النص الأبجدي الرقمي 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;
  }
}

استخدام مجموعة أدوات التحكم ASP.NET AJAX

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

واستخدام filteredTextBoxEnder.

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

في 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;
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top