2008-08-16 18 views
5

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

ProcessDialogKey का उपयोग करके मैंने इसे ठीक तरह से काम करने में कामयाब रहा है लेकिन मुझे अभी भी एक समस्या है। मेरा सवाल यह है कि अगर WinForms नियंत्रण को ध्यान में रखा गया तो यह पता लगाने का कोई तरीका है क्योंकि मैं यह भी जानना चाहूंगा कि मेरा UserControl किसी टैब या शिफ्ट-टैब से फ़ोकस कर रहा है और फिर मेरी अजीब चीजें करें लेकिन यदि उपयोगकर्ता नियंत्रण पर क्लिक करता है I कुछ खास नहीं करना चाहते हैं।

उत्तर

3

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

अब, यह कहकर, मैंने इस नियम को ग्राहक के अनुरोध पर भी तोड़ दिया है। हमने टैब कुंजी की तरह एंटर कुंजी फ़ंक्शन बनाया है, जहां एंटर कुंजी टेक्स्ट फ़ील्ड में मान को सहेज लेगी, और कर्सर को अगले फ़ील्ड में अग्रिम करेगी।

1

मुझे नहीं लगता कि एक अंतर्निहित तरीका है जिसे आप कर सकते हैं। सभी WinForms फ़ोकस ईवेंट (GotFocus, LostFocus, Enter, Leave) को खाली EventArgs पैरामीटर के साथ बुलाया जाता है, जो आपको कोई अतिरिक्त जानकारी नहीं देगा।

व्यक्तिगत रूप से, मैं तीसरे टेक्स्टबॉक्स को अक्षम कर दूंगा, क्योंकि रॉब थॉमस ने कहा था। यदि आप ऐसा करने के लिए दृढ़ हैं, हालांकि, मैन्युअल (पढ़ना: हैकिश) समाधान स्थापित करना मुश्किल नहीं होगा। एक बार टैब कुंजी दबाए जाने पर (यदि फोकस दूसरे टेक्स्टबॉक्स पर है), तो अपने फॉर्म के अंदर एक चर सेट करें। यदि अगला ऑब्जेक्ट फ़ोकस है तो तीसरा टेक्स्टबॉक्स है, तो आप जानते हैं कि यह कैसा हुआ।

0

मैं डैनीसमुर्फ से सहमत हूं। टैब ऑर्डर के साथ मेसिंग आपको बाद में नरक दे सकती है अगर आवेदन की आवश्यकताएं बदलती हैं।

एक और चीज जो आप कर सकते हैं उपयोगकर्ता के माध्यम से जाने के लिए किसी प्रकार का जादूगर लागू करना है।

1

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

इनपुट के लिए धन्यवाद!

0

नियंत्रण अक्षम करने से बेहतर, टैबस्टॉप के साथ बंदरगाह करने की कोशिश करें - यदि यह गलत है, तो टैबबिंग के दौरान नियंत्रण को छोड़ दिया जाएगा।

मैं यह भी सुझाव दूंगा कि टेक्स्टबॉक्स की बदलती घटना अन्य नियंत्रणों पर टैबस्टॉप को अपडेट करने का स्थान है।

मैंने लॉगिन नियंत्रण के साथ ऐसा कुछ किया है, जहां उपयोगकर्ता या तो उपयोगकर्ता नाम या ईमेल पता (अलग-अलग क्षेत्रों में) दर्ज कर सकते हैं, साथ ही उनका पासवर्ड, और टैबस्टॉप वह है जो मैंने काम पूरा करने के लिए उपयोग किया था।