2009-04-29 4 views
40

WinForms में, एक विशिष्ट नियंत्रण पर ध्यान केंद्रित करने के लिए, मैं हमेशा काम करने के लिए Control.Select()औरControl.Focus() पर कॉल करना बंद कर देता हूं।Control.Select() और Control.Focus() के बीच क्या अंतर है?

क्या अंतर है, और क्या यह सही दृष्टिकोण है?

उत्तर

19

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

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

+17

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

+5

मुझे संदेह है कि अधिकांश लोग Google में इस प्रश्न को टाइप करने से पहले एमएसडीएन पढ़ेंगे। बस इसे दोहराना verbatum बहुत उपयोगी नहीं है। –

31

फोकस() निम्न स्तर समारोह है कि वास्तव में ध्यान केंद्रित करता है।

चुनें() एक उच्च स्तर की विधि है। यह पहली बार नियंत्रण के माता-पिता पदानुक्रम में ऊपर की ओर दिखता है जब तक कि यह एक कंटेनर नियंत्रण नहीं पाता। फिर यह उस कंटेनर की ActiveControl संपत्ति (जिसे नियंत्रित नियंत्रण में) सेट करता है। हालांकि, उन तरीकों में तर्क सरल नहीं है, और उपयोगकर्ता नियंत्रण कंटेनर के लिए विशेष हैंडलिंग है।

1

व्यक्तिगत अनुभव से मैंने विंडोज कॉम्बोबॉक्स को विरासत में एक उपयोगकर्ता नियंत्रण लिखा था। मैं OnEnter घटना ओवरराइड करने के लिए कोड लिखने के लिए था और मैं वहाँ

If Me.Focused Then ... Else ... 

कह हालांकि, दुर्भाग्य से यह अनपेक्षित परिणाम प्राप्त में एक बयान दिया था। अगर मैंने MyCustomerComboControl.Select (या तो लोड, दिखाया या सक्रिय घटनाओं में) कहा जाता है तो इसे OnEnter विधि कहा जाता है लेकिन पंजीकरण करने में विफल रहा, लेकिन इसमें फोकस था (यानी फोकस किया गया था) लेकिन अगर मैंने फोकस कहा तो यह काम करता था। इसके अलावा Select काम करता था अगर फॉर्म खुला था यानी अगर मैंने एक और नियंत्रण चुना तो मूल नियंत्रण को फिर से चुना गया, सब ठीक था। तो मेरे परिदृश्य के अलावा किसी अन्य परिस्थिति में, Select का उपयोग करें क्योंकि यह ऊपर बताता है।

4

उदाहरण के लिए कि वे अलग-अलग हैं, यदि आप इसे खोलते समय डिफ़ॉल्ट फोकस करने के लिए किसी फॉर्म ऐप के लिए नियंत्रण सेट करने का प्रयास कर रहे हैं, तो केवल प्रारंभ करें() InitializeComponent() के बाद कन्स्ट्रक्टर में कॉल किए जाने पर ही काम करेगा। फोकस() नहीं होगा।

+0

मैं इसे देख सकता हूं, इसके लिए संभवतः क्या कारण हो सकता है? –

3

बस इस धागे को जोड़ने के लिए मैंने पाया कि जब उपयोगकर्ता नियंत्रण लिखते हैं जो अन्य नियंत्रणों को एक रूप से दूसरे (नए बनाए गए फॉर्म) में ले जाता है। मूल रूप अब नियंत्रण का चयन नहीं कर सका लेकिन फोकस का उपयोग करके ऐसा करने की अनुमति दी गई। मुझे लगता है कि यह इन विधियों के स्तर के बारे में उत्तरों पर जोर देता है। लेकिन इसका मतलब यह भी है कि उपयोग करने के लिए पर्याप्त आसान नहीं है उच्च स्तर पर चयन करें क्योंकि अब मूल रूप से अपेक्षित के रूप में चयन नहीं किया गया है (यह नहीं कि इसे इसे एक अलग रूप में रखा जाना चाहिए - मैं इसे स्वीकार करता हूं)

0

फोकस(), कुछ परिस्थितियों में, फोकस नहीं होने पर नियंत्रण प्राप्त करने के लिए एक खिड़की नियंत्रण का कारण बन सकती है। चुनें() विंडो द्वारा फोकस फोकस नहीं करता है।