2012-09-26 13 views
11

मैं विज़ुअल सी # टेक्स्टबॉक्स में केवल कुछ वर्णों को कैसे अनुमति दे सकता हूं? उपयोगकर्ता निम्नलिखित वर्णों को एक टेक्स्ट बॉक्स में इनपुट करने में सक्षम होना चाहिए, और बाकी सब कुछ अवरुद्ध होना चाहिए: 0-9, +, -, /, *, (,)।केवल टेक्स्टबॉक्स में विशिष्ट वर्णों की अनुमति दें

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

+4

ASP.NET? WinForms? WPF? ये सभी सी # का उपयोग कर सकते हैं, और सभी अलग हैं। – David

+0

यह एक विंडोज़ फॉर्म एप्लीकेशन है। –

+1

क्या आपने PropertyChanged ईवेंट के लिए ईवेंट हैंडलर बनाने का प्रयास किया है, यदि यह अमान्य है तो चरित्र को हटा देता है? –

उत्तर

23

जैसा कि एक टिप्पणी में उल्लिखित है (और जैसा कि मैंने टाइप किया है) और आपको टेक्स्ट बॉक्स पर कीडाउन या कीप्रेस ईवेंट को पकड़ने के लिए एक ईवेंट हैंडलर पंजीकृत करने की आवश्यकता है। इसका कारण यह है TextChanged केवल निकाल दिया जाता है जब पाठ बॉक्स ध्यान केंद्रित

नीचे regex आप उन अक्षरों को आप

Regex regex = new Regex(@"[0-9+\-\/\*\(\)]"); 
MatchCollection matches = regex.Matches(textValue); 

अनुमति देना चाहते हैं मिलाने की सुविधा देती खो देता है और इस विपरीत है और वर्ण की अनुमति नहीं है पकड़ता

Regex regex = new Regex(@"[^0-9^+^\-^\/^\*^\(^\)]"); 
MatchCollection matches = regex.Matches(textValue); 

मुझे लगता है कि कोई भी मैच नहीं होगा क्योंकि कोई टेक्स्ट टेक्स्ट में टेक्स्ट पेस्ट कर सकता है। ऐसी स्थिति में पकड़

textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged); 
private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    Regex regex = new Regex(@"[^0-9^+^\-^\/^\*^\(^\)]"); 
    MatchCollection matches = regex.Matches(textBox1.Text); 
    if (matches.Count > 0) { 
     //tell the user 
    } 
} 

textchanged और एकल कुंजी दबाव

textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress); 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    // Check for a naughty character in the KeyDown event. 
    if (System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[^0-9^+^\-^\/^\*^\(^\)]")) 
    { 
     // Stop the character from being entered into the control since it is illegal. 
     e.Handled = true; 
    } 
} 
+2

आप कोड 8 के साथ कुंजी के लिए अतिरिक्त चेक जोड़ना चाहेंगे, अन्यथा बैकस्पेस – imaximchuk

+0

काम नहीं करेगा यदि कोई और इसमें चलता है ... मैं इसे 'कीप्रेस' हैंडलर में काम करने में सक्षम नहीं था। भले ही मैंने 'e.Handled' को 'सत्य' पर सेट किया है, फिर भी यह चरित्र को नियंत्रण में सम्मिलित करता है। जब मैंने इसके बजाए 'कीडाउन' को संभालने के लिए स्विच किया, तो सबकुछ ठीक काम करता था। मैं जिस नियंत्रण का उपयोग कर रहा हूं वह एक 'RichTextBox' है, जिससे इसका कुछ संबंध हो सकता है। काम करने के बाद मैंने बहुत प्रयोग नहीं किया। – danBhentschel

+1

एक साइड नोट के रूप में, जब टेक्स्ट फोकस खो देता है, तो टेक्स्ट चेंजेड को निकाल दिया नहीं जाता है, लेकिन टेक्स्ट में बदलाव के बाद (उदाहरण के लिए, यदि मैं मान्य हूं तो टेक्स्ट को रंग देने के लिए इसका उपयोग करें)। यह बहुत देर हो चुकी है। – Teejay

1

आप शायद KeyDown event, KeyPress event या KeyUp event का उपयोग कर सकते हैं। मैं सबसे पहले मुझे लगता है कि KeyDown घटना का प्रयास करेंगे।

आप घटना को संभालने से रोकने के लिए ईवेंट तर्कों की हैंडल संपत्ति सेट कर सकते हैं।

0

आपके सत्यापन ईवेंट के लिए आईएमओ टेक्स्टबॉक्स अक्षरों को सत्यापित करने के लिए एक वर्ण सरणी का उपयोग करना सबसे आसान तरीका होगा। सही - पुनरावृत्ति और सत्यापन विशेष रूप से कुशल नहीं है, लेकिन यह सीधा है।

वैकल्पिक रूप से, इनपुट स्ट्रिंग के खिलाफ अपने श्वेतसूची वर्णों की नियमित अभिव्यक्ति का उपयोग करें। एमएसडीएन में आपकी घटनाएं उपलब्ध हैं: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

10

आप पाठ बॉक्स पर KeyDown घटना की सदस्यता के लिए की जरूरत को मान्य करने के। फिर कुछ इस तरह:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if (!char.IsControl(e.KeyChar) 
     && !char.IsDigit(e.KeyChar) 
     && e.KeyChar != '.' && e.KeyChar != '+' && e.KeyChar != '-' 
     && e.KeyChar != '(' && e.KeyChar != ')' && e.KeyChar != '*' 
     && e.KeyChar != '/') 
    { 
     e.Handled = true; 
     return; 
    } 
    e.Handled=false; 
    return; 
} 

महत्वपूर्ण बात यह पता चला है कि अगर आप true को Handled संपत्ति बदल गया है, यह कीस्ट्रोक पर कार्रवाई नहीं करेगा। इसे false पर सेट करना होगा।

-1
private void txtuser_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (!char.IsLetter(e.KeyChar) && !char.IsWhiteSpace(e.KeyChar) && !char.IsControl(e.KeyChar)) 
     { 
      e.Handled = true; 
     } 
    } 
0

कुंजीपटल की घटना को रोकना मेरी राय में एक अच्छा ठोस समाधान है। यदि आप RegExp का उपयोग करते हैं तो कोड वर्णों को ट्रिगर करने के लिए ध्यान दें (ई। केकर कम 32)।

लेकिन जब भी उपयोगकर्ता क्लिपबोर्ड से टेक्स्ट पेस्ट करता है तो इस तरह से सीमा से बाहर अक्षरों को इंजेक्ट करना संभव है। दुर्भाग्यवश मुझे इसे ठीक करने के लिए सही क्लिपबोर्ड घटनाएं नहीं मिलीं।

तो एक वाटरप्रूफ समाधान टेक्स्टबॉक्स को अवरुद्ध करना है। टेक्स्ट चेंज किया गया। कम समय के लिए, कभी-कभी रेंज कैरेक्टर का मूल दृश्य दिखाई देता है। मैं दोनों को लागू करने की सलाह देते हैं।

using System.Text.RegularExpressions;

private void Form1_Shown(object sender, EventArgs e) 
{ 
    filterTextBoxContent(textBox1); 
} 


string pattern = @"[^0-9^+^\-^/^*^(^)]"; 

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if(e.KeyChar >= 32 && Regex.Match(e.KeyChar.ToString(), pattern).Success) { e.Handled = true; } 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    filterTextBoxContent(textBox1); 
} 

private bool filterTextBoxContent(TextBox textBox) 
{ 
    string text = textBox.Text; 

    MatchCollection matches = Regex.Matches(text, pattern); 
    bool matched = false; 

    int selectionStart = textBox.SelectionStart; 
    int selectionLength = textBox.SelectionLength; 

    int leftShift = 0; 
    foreach (Match match in matches) 
    { 
     if (match.Success && match.Captures.Count > 0) 
     { 
      matched = true; 
      Capture capture = match.Captures[0]; 

      int captureLength = capture.Length; 
      int captureStart = capture.Index - leftShift; 
      int captureEnd = captureStart + captureLength; 

      int selectionEnd = selectionStart + selectionLength; 

      text = text.Substring(0, captureStart) + text.Substring(captureEnd, text.Length - captureEnd); 

      textBox.Text = text; 

      int boundSelectionStart = selectionStart < captureStart ? -1 : (selectionStart < captureEnd ? 0 : 1); 
      int boundSelectionEnd = selectionEnd < captureStart ? -1 : (selectionEnd < captureEnd ? 0 : 1); 

      if (boundSelectionStart == -1) 
      { 
       if (boundSelectionEnd == 0) 
       { 
        selectionLength -= selectionEnd - captureStart; 
       } 
       else if (boundSelectionEnd == 1) 
       { 
        selectionLength -= captureLength; 
       } 
      } 
      else if (boundSelectionStart == 0) 
      { 
       if (boundSelectionEnd == 0) 
       { 
        selectionStart = captureStart; 
        selectionLength = 0; 
       } 
       else if (boundSelectionEnd == 1) 
       { 
        selectionStart = captureStart; 
        selectionLength -= captureEnd - selectionStart; 
       } 
      } 
      else if (boundSelectionStart == 1) 
      { 
       selectionStart -= captureLength; 
      } 

      leftShift++; 
     } 
    } 

    textBox.SelectionStart = selectionStart; 
    textBox.SelectionLength = selectionLength; 

    return matched; 
} 
संबंधित मुद्दे