2009-05-26 12 views
16

मेरे पास एक टेक्स्टबॉक्स है जिसे किसी विशेष वर्ण दर्ज करने की अनुमति नहीं देनी चाहिए।टेक्स्टबॉक्स में केवल अल्फान्यूमेरिक को अनुमति दें

उपयोगकर्ता प्रवेश कर सकते हैं:

  1. को A से Z
  2. a-z
  3. 0-9
  4. अंतरिक्ष

मैं कैसे KeyDown घटना यह करने के लिए कर सकते हैं?

+0

में आप asp.net में यह करना चाहते हैं? – ecleel

+0

मैं इसे WPF – Sauron

+0

में रूचि चाहता हूं - मैंने कभी भी एक चयनित उत्तर के साथ कोई प्रश्न नहीं देखा है जिसे पहले हटा दिया गया था। – MusiGenesis

उत्तर

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

अन्य वर्णों को फ़िल्टर करने के लिए रेगेक्स का उपयोग करें। या अवांछित वर्णों को फ़िल्टर करने के लिए Char.IsDigit, IsXXX विधियों का उपयोग करें। ऐसा करने के कई तरीके।

अद्यतन: यदि आपको KeyDown का उपयोग करना होगा तो ऐसा लगता है कि आपको KeyPressed को संभालने और obEventArgs.Handled = अक्षर को अस्वीकार करने के लिए सही सेट करने की आवश्यकता है। KeyDown MSDN Page

अद्यतन पर उदाहरण देखें: अब जब आप इसे WPF निर्दिष्ट करते हैं। नीचे दिया गया कोड टेक्स्टबॉक्स में केवल ए-जेड और ए-जेड अक्षरों को दर्ज करने की अनुमति देगा। आवश्यकतानुसार विस्तार करें ...

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

यदि आप टेक्स्ट-बॉक्स में सामान कॉपी-पेस्ट करते हैं तो यह टूट जाएगा। एक बार जब उपयोगकर्ता नियंत्रण छोड़ देता है या जब वह ठीक क्लिक करता है/MusicGenesis के रूप में जमा करता है तो पूरे टेक्स्ट को मान्य करें।

+0

क्या यह KeyDown घटना में किया जा सकता है? – Sauron

+3

मैंने अभी पाया है कि आप वास्तव में अन्य मूल्यों के साथ अन्य मूल्यों की तुलना कर सकते हैं = ... बहुत बहुत धन्यवाद, बहुत आसान! टेक्स्टबॉक्स में उपयोगकर्ता "कॉपी-पेस्टिंग" का उल्लेख करने के लिए – David

31

कुंजीडाउन या कीप्रेस घटनाओं को संभालना ऐसा करने का एक तरीका है, लेकिन प्रोग्रामर आमतौर पर भूल जाते हैं कि कोई उपयोगकर्ता टेक्स्टबॉक्स में अमान्य पाठ को कॉपी और पेस्ट कर सकता है।

टेक्स्ट चेंज किए गए ईवेंट को संभालने का कुछ बेहतर तरीका है, और वहां किसी भी अपमानजनक पात्रों को बाहर निकालना है। यह थोड़ा और जटिल है, क्योंकि आपको कैरेट की स्थिति का ट्रैक रखना है और बॉक्स की टेक्स्ट प्रॉपर्टी को बदलने के बाद इसे उचित स्थान पर सेट करना है।

आपके आवेदन की ज़रूरतों के आधार पर, मैं उपयोगकर्ता को जो कुछ भी चाहता हूं उसे टाइप करने देता हूं, और फिर जब उपयोगकर्ता सबमिट करने का प्रयास करता है तो टेक्स्टबॉक्स (टेक्स्ट लाल या कुछ चालू करें) को ध्वजांकित करता है।

+4

+1। – Joel

1

और अपने regexp दिखाई दे सकता है [0-9a-zA-Z] * केवल अंग्रेजी अक्षरांकीय chracters

2

मैं जानता हूँ कि WinForms उपलब्ध एक MaskedTextBox नियंत्रण, आप बात का बिल्कुल इस तरह निर्दिष्ट कर सकते हैं जो कि अनुमति देने के लिए। मुझे डब्ल्यूपीएफ नहीं पता, इसलिए मुझे पता नहीं है कि वह वहां उपलब्ध है, लेकिन अगर ऐसा है, तो ऐसा करें। कुंजीपटल और घटनाओं के साथ इन सभी चीजों की तुलना में यह बहुत आसान है, और अधिक मजबूत भी है।

3

मुझे लगता है कि टेक्स्टबॉक्स के टेक्स्ट चेंजेड ईवेंट पर फ़िल्टरिंग करने पर विचार करना उचित है। आप एक ऑपरेशन बना सकते हैं जो आपकी टेक्स्ट स्ट्रिंग से किसी भी गैर-मान्य वर्णों से छुटकारा पाता है। KeyDown घटना को अवरुद्ध करने से यह थोड़ा और गन्दा है।

लेकिन, मुझे लगता है कि यह जाने का तरीका है क्योंकि आप डब्ल्यूपीएफ के अंतर्निहित कीडाउन/अप इवेंट हैंडलिंग तंत्र को अवरुद्ध नहीं कर रहे हैं, इसलिए कॉपी/पेस्ट अभी भी काम करता है। आप उच्च स्तर के अवशेषों पर काम करेंगे, इसलिए मुझे लगता है कि क्या हो रहा है यह पता लगाना आसान होगा।

2

यह करने के लिए किया जाएगा सबसे आसान तरीका है विस्तारित WPF टूलकिट जो कर रही है वास्तव में क्या आप एक मुखौटा निर्दिष्ट करके के लिए पूछ रहे हैं के लिए एक नियंत्रण नहीं है शामिल थे।

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

यह भी पाठ बॉक्स में मुखौटा प्रदर्शित के रूप में आप यदि आवश्यक इनपुट कर रहे हैं।

1

केवल अक्षरांकीय पाठ बॉक्स WPF सी #,

मेरी अंग्रेजी के लिए खेद (यह भी कई अन्य उपयोगी नियंत्रण होते हैं) .. लेकिन WPF, सी # के लिए इस कोड के साथ, मैं केवल अक्षरांकीय की अनुमति

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

मैं चांदी की रोशनी में इसमें भाग गया और इस तरह कुछ लिखा।

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

बस खोज से यहाँ समाप्त उन लोगों के लिए कुछ कोड जोड़ना चाहते थे:

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

मैं इसका उपयोग कर समाप्त हुआ, धन्यवाद! –

3

मैं इसे एक कस्टम निर्भरता संपत्ति के साथ पूरा करता हूं। यह किसी भी TextBox नियंत्रण के लिए पुन: प्रयोज्य है, महत्वपूर्ण घटनाओं के निर्माण से उपयोग करने के लिए बहुत तेज और अधिक कुशल है, और मेरी कोड फ़ाइलों को अधिक क्लीनर बनाता है।

इसके अलावा, यह अन्य इनपुट विधियों को संभाल सकता है जो कुंजी घटनाओं को ट्रिगर नहीं करता है, जैसे माउस का उपयोग करके टेक्स्टबॉक्स में मूल्य चिपकाना।

कस्टम के लिए कोड डीपी इस तरह दिखता है:

// 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" /> 
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> 
0

my.Net फ्रेमवर्क 4.5 सी # आवेदन

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; 
     } 
    } 
संबंधित मुद्दे