2009-03-05 11 views
7

TextBox नियंत्रण (या कुछ भी जो .NET 3.5 के साथ मानक आता है) के इनपुट को प्रतिबंधित करने का सबसे शानदार तरीका फ़्लोटिंग पॉइंट नंबरों पर क्या है?सी # में टेक्स्टबॉक्स पर इनपुट प्रतिबंध लागू करने का सबसे अच्छा तरीका क्या है?

वर्तमान में, मैं TextBox से विरासत में और OnKeyPress को ओवरराइड करके स्वयं को भारी भारोत्तोलन कर रहा हूं। हालांकि, मैं मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि क्या मैं पहिया को पुनर्निर्मित कर रहा हूं।

उत्तर

13

निम्न समस्याओं/कोने-मामलों है कि आपके सामने उत्पन्न हो जाएगा मत भूलना अगर आप अपने प्रस्तावित मार्ग नीचे जाना:

  • उपयोगकर्ता Ctrl उपयोग कर सकते हैं - वी या शिफ्ट - "अमान्य" मानों को पेस्ट करने के लिए डालें (वह दूसरा एक पकड़ने के लिए थोड़ा सा ट्रिकियर है) ... लेकिन उपयोगकर्ताओं को शायद कानूनी मानों को नियंत्रण में पेस्ट करने की अनुमति दी जानी चाहिए
  • उपयोगकर्ता राइट क्लिक कर सकते हैं, अमान्य मूल्यों को यूएसआई में पेस्ट कर सकते हैं ng डिफ़ॉल्ट संदर्भ-मेनू
  • भले ही आपने टेक्स्टबॉक्स को अपना संदर्भ मेनू देकर पिछली समस्या को ठीक करने का प्रयास किया हो, फिर भी उपयोगकर्ता आपके नियंत्रण से बाहर राइट-क्लिक कर सकते हैं, दायां बटन दबा सकते हैं, अपने टेक्स्टबॉक्स पर खींच सकते हैं और चलो डिफ़ॉल्ट संदर्भ मेनू का उपयोग करने के लिए जाना (और अमान्य मान में चिपकाएं)
  • जो भी कुंजी प्रसंस्करण आप Alt तरह कुंजी संयोजन को अक्षम नहीं करना चाहिए - F4, आदि (और हाँ, आप अगर आप इस टूट जाएगा SuppressKeyPress जो कि वैध अंक नहीं है)
  • उपयोगकर्ता शायद आंशिक मान दर्ज कर सकते हैं (उदाहरण के लिए"-.", वे "-.23") अपने पाठ बॉक्स के बिना टाइप करने के लिए उन्हें
  • नंबर को दंडित करने "-.1e-2" कानूनी माना जा सकता है की तरह शुरू के रूप में
  • एक उपयोगकर्ता feasibly जो केवल अंक हैं एक मूल्य में प्रवेश कर सकता है, लेकिन जो एक float
  • अतिप्रवाह होगा सबसे खराब: कुछ अन्य रहस्यमय कोने का मामला जो आपके उपयोगकर्ताओं को भेजे जाने के बाद मिलेगा (!!)

नैतिक? आप जो सुझाव दे रहे हैं वह करना बहुत मुश्किल हो सकता है।

आप शायद या तो निम्न में से संयोजन क्या करना चाहते हैं:

  • एक नियंत्रण का प्रयोग करें कि किसी को है कि सभी कोने बनाया (माइक्रोसॉफ्ट) की तरह के मामलों
  • TextChanged स्थिति में बुनियादी मान्यता क्या जानता है (और कुछ निष्क्रिय कर रही है, पाठ बॉक्स पृष्ठभूमि रंग बदलना) की तरह
  • सहेजें मान्यता जब तक आप वास्तव में मूल्य वे
  • लिखने से उपयोग करने के लिए आप के लिए उपयोगकर्ता के मूल्य Parse करने के लिए सिस्टम पुस्तकालयों का उपयोग करें कोशिश

    maskedTextBox1.ValidatingType = typeof(System.Double); 
    

    यह वास्तव में यह बताती हैं कि यह वैध है या नहीं करता है:

+0

गह, इतने सारे किनारे के मामलों का ख्याल रखना। मैं उपयोगकर्ताओं से नफरत करता हूं ...;) –

+0

@ecarF: कोई मजाक नहीं; यही कारण है कि वास्तव में एक मजबूत इनपुट नियंत्रण बनाने के लिए ऐसा दर्द है जैसे कि ओपी पूछ रहा है। –

+0

Yup, उपयोगकर्ता को जो कुछ भी कर रहे हैं उसे पूरा करने के लिए प्रतीक्षा करें (ठीक दबाएं), फिर रीगेक्स के साथ मान को दबाएं और या तो जारी रखें या संदेशबॉक्स फेंक दें। OnKeyPress ओवरराइड करने से बहुत अच्छा है। – Karl

2

MaskedTextBox नियंत्रण पर एक नज़र डालें। यह टेक्स्टबॉक्सबॉक्स से भी विरासत में मिलता है और संभवतया वह कार्यक्षमता है जिसे आप अपने निर्माण में कर रहे हैं।

+0

त्वरित प्रतिक्रिया, माइक के लिए धन्यवाद। मैं इस तथ्य अनुसंधान के क्षेत्र में शारीरिक श्रम का सहारा से पहले MaskedTextBox नियंत्रण, हालांकि, मैं यह व्यवहार करने के लिए नहीं मिल सका है कि मैं चल बिन्दु संख्या के साथ बॉक्स से बाहर करना चाहता था। शायद मैं कुछ मूर्ख था, हालांकि ... –

+0

मैं, नहीं लगता MaskedTextBox यहाँ कुछ भी अच्छा कर सकता है कि है के रूप में यह चरित्र की एक अनंत (उपयोगकर्ता परिभाषित) संख्या अनुमति देने के लिए प्रतीत नहीं होता। –

0

मुझे नहीं लगता कि पहिया का आविष्कार अभी तक किया गया है (कम से कम .NET ढांचे में)। मुझे यकीन है कि कोडप्रोजेक्ट या ऐसा कुछ है जो आप जो भी हो उसके समान कर रहे हैं, इसलिए यह Google के लायक हो सकता है।

हालांकि भारी उठाना बहुत अविश्वसनीय रूप से बुरा नहीं होना चाहिए। पहली नज़र की तुलना में इसके लिए थोड़ा और अधिक है।

ज्यादा सरल उदाहरण आप OnKeyPress संभाल कर सकते हैं, में संलग्न नए चरित्र के साथ एक Float.TryParse करना है सही होने पर, कुंजी दबाने रखना। यदि गलत है, तो इसे रद्द करें (e.Handled = true)।

कठिन हिस्सा यह है कि यदि वे चयन हटाते हैं, काटते हैं या पेस्ट करते हैं।

+0

http://www.codeproject.com/KB/edit/RegexText.aspx यह करने के लिए लग रहे हैं। –

+0

आपके सुझाव के लिए धन्यवाद, लेकिन यह इतना आसान नहीं है। क्या होगा यदि उपयोगकर्ता कैरेट की स्थिति बदलता है? जहां तक ​​मैं देख सकता हूं, आप अंधेरे में शामिल नहीं हो सकते हैं। –

+0

लिंक VirualBlackFox के लिए धन्यवाद। मैं निश्चित रूप से एक नज़र रखना होगा। –

0

... या

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(..) // your condition 
    { 
    e.SuppressKeyPress = false; 
    } 
    else 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

या

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method 
} 
का उपयोग कर मैच के लिए जाँच - दूसरी बात, जब वे सिर्फ बाहर शुरू कर रहे हैं (के रूप में आंशिक मान्य इनपुट "" आप स्वीकार करने के लिए चाहते हो सकता है) है
1

न्यूमेरिक अपडाउन का उपयोग करने के बारे में क्या?

0

मैं एक maskedTextBox की ValidatingType संपत्ति की खोज की। दुर्भाग्यवश, जब फोकस बदलता है तो यह केवल मान्य होता है (और फिर भी यह वास्तव में कुछ भी नहीं करता है); लेकिन शायद इसका उपयोग करने का कोई तरीका है।

+0

जब भी आप चाहें तो "ValidateText" विधि को कॉल कर सकते हैं। तो फोकस चेंज प्रतिबंध से दूर जाने के लिए, टेक्स्ट चेंज के लिए एक हैंडलर सेट करें, और कहें कि (मास्कड टेक्स्टबॉक्स 1। मास्क कॉम्प्लेटेड) {maskedTextBox1.ValidateText(); } – CJBrew

0

यह डेटा प्रविष्टि के दौरान सत्यापन करने के लिए आवश्यक है, या आप अंतिम मूल्य की जाँच करने के दर्ज एक बार ध्यान खो दिया है बर्दाश्त कर सकते हैं?

बाद, तो आप भी एक ErrorProvider नियंत्रण कार्यक्षमता सीमित जब तक इनपुट हल हो गई है मदद करने के लिए उपयोग कर सकते हैं।

+0

धन्यवाद, मुझे लगता है कि मुझे बेहतर समझा जाना चाहिए था। मैं डेटा एंट्री के दौरान उपयोगकर्ता इनपुट को मान्य कर रहा हूं। –

संबंधित मुद्दे

 संबंधित मुद्दे