2011-09-14 14 views
5

मुझे फ़ॉर्म पर सभी नियंत्रणों के लिए एक ही ईवेंट हैंडलर सेट करने में समस्या है। मैं अपने आवेदन में समान रूप से दबाए गए f5-f7 बटन को संभालना चाहता हूं, इसलिए मैं फ़ॉर्म पर सभी नियंत्रणों के लिए एक ही ईवेंट हैंडलर को पंजीकृत करने का प्रयास करता हूं। मैं InitializeComponent मेंफॉर्म पर सभी नियंत्रणों के लिए एक ईवेंट हैंडलर

foreach (System.Windows.Forms.Control cont in this.Controls) 
       cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress); 

डाला() फ़ंक्शन बस से पहले स्वचालित रूप से उत्पन्न ResumeLayout/PerformLayout कहता है। MainForm_KeyPress नाम को ध्यान में रखें, यह वास्तव में अब एक KeyDown ईवेंट हैंडलर है।

मैंने अपने init() फ़ंक्शन में कोड डालने का भी प्रयास किया जिसे कन्स्ट्रक्टर से कहा जाता है। लेकिन परिणाम वही था: जब मैं कुंजी दबाता हूं तो ईवेंट नहीं होता है। फ़ोकस फ़ॉर्म के बटनों में से एक पर है।

लेकिन अगर मैं डिज़ाइन टूल (प्रतिलिपि समारोह फ़ील्ड में कॉपी फ़ंक्शन नाम) का उपयोग करके बटनों में से एक के लिए हैंडलर लागू करता हूं, तो बटन फोकस में होने पर ईवेंट सही ढंग से बढ़ता है।

कोई विचार क्यों foreach काम नहीं किया?

+3

एक घटना हैंडलर उन सभी पर शासन करने के लिए? – jason

+0

कृपया अपने शीर्षक "सी #:" के साथ उपसर्ग न करें। यही टैग है। –

+0

@ जेसन - और अंधेरे में डेटा-उन्हें बांधें। – TrueWill

उत्तर

6

एमएसडीएन का कहना है कि आप KeyPreview को सही पर सेट करने के साथ कर सकते हैं।

+0

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

+0

@Ingenu धन्यवाद! इतना आसान जवाब! – HtonS

+0

@Ingenu बहुत बहुत धन्यवाद –

1

शायद आपको पेड़ के नीचे, आपके द्वारा सामना किए जाने वाले प्रत्येक नियंत्रण के बाल नियंत्रण के लिए इसे पुन: साझा करने और पंजीकरण करने की आवश्यकता है?

पहली समस्या जो मैं इस समस्या को करने पर करता हूं उसे पंजीकरण और आउटपुट के आसपास {} नियंत्रण नाम "के लिए पंजीकृत किया जाता है। इस तरह आप देख सकते हैं और देख सकते हैं कि कितने नियंत्रण पंजीकृत हैं और वे क्या हैं। शायद यह सिर्फ मुख्य पैनल है, और subcontrols कुंजी नीचे प्रक्रिया? डॉकमैनगर में काम करते समय मुझे मुख्य प्रेस इवेंट हैंडलर के साथ परेशानी हुई है, डॉकमैनर कीबोर्ड को दूसरे स्तर पर संभालने और घटना को उस विशिष्ट बाल नियंत्रण में घुमा रहा था जिसे उसने सोचा था।

यदि आप अभी भी इसे समझ नहीं पाते हैं, तो अगली चीज़ मैं फॉर्म की घटनाओं को तारित कर सकता हूं, या शायद WM_ विंडोज संदेश ईवेंट की निगरानी भी कर सकता हूं। किसी बिंदु पर WM_ को कोड द्वारा .NET ईवेंट में अनुवादित किया जाता है, और इसे उन तरीकों से कार्यान्वित किया जा सकता है जिनकी आप अपेक्षा नहीं करते हैं, और तृतीय-पक्ष नियंत्रणों द्वारा अपहृत आदि। ऑपरेटिंग सिस्टम को आपकी प्रक्रिया में WM_ ईवेंट को रूट करना होगा , इसलिए उन्हें पास-थ्रू ईवेंट हैंडलर के साथ ट्रैक करें जो लॉग इन करते हैं।

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

+0

मैंने आपके उत्तर को पहले देखा और यह जांचने के लिए आपकी सलाह का पालन किया कि सभी नियंत्रण फ़ोरैच में संसाधित किए गए हैं या नहीं। आप सही थे, बाल नियंत्रण पंजीकृत नहीं थे। तो मैंने एक रिकर्सन जोड़ा, और सब ठीक काम किया। लेकिन इंजेनु का जवाब अधिक सरल है इसलिए मैं इसका उपयोग करूंगा =) फिर से धन्यवाद! यह दयालु है कि मैं दो पदों को उत्तर के रूप में चिह्नित नहीं कर सकता – HtonS

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