2008-09-01 6 views
6

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

Sample App Screen Shot

उपयोगकर्ता textbox1, TextBox2, textbox3, आदि में डेटा दर्ज किया और बटन क्लिक कर सकते हैं। मुझे उस फोकस को वापस उस नियंत्रण में वापस करने के लिए बटन की आवश्यकता है जिसे बटन पर क्लिक करने से पहले हाल ही में फोकस था।

मुझे आश्चर्य है कि अगर किसी के पास आने के मुकाबले इस कार्यक्षमता को लागू करने का कोई बेहतर तरीका है। यहाँ अभी मैं क्या कर रहा है:

public partial class Form1 : Form 
    { 
     Control _lastEnteredControl; 

     private void textBox_Enter(object sender, EventArgs e) 
     { 
      _lastEnteredControl = (Control)sender; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Do something here"); 
      _lastEnteredControl.Focus(); 
     } 


    } 

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

उत्तर

16

कुछ 'सादगी' के लिए शायद कोशिश करें।

public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control ctrl in Controls) 
     { 
      if (ctrl is TextBox) 
      { 
       ctrl.Enter += delegate(object sender, EventArgs e) 
           { 
            _lastEnteredControl = (Control)sender; 
           }; 
      } 
     } 
    } 

तो आपको मैन्युअल रूप से प्रत्येक टेक्स्टबॉक्स को सजाने (या लगभग एक को भूलने) के बारे में चिंता करने की ज़रूरत नहीं है।

+0

आपको रिकर्सन की आवश्यकता है। – SLaks

0

आपका कार्यान्वयन काफी अच्छा दिखता है - जो मैं जानना चाहता हूं वह है कि आप इसे पहले स्थान पर क्यों करना चाहते हैं? क्या पहली प्रविष्टि में वापस चक्र पर ध्यान केंद्रित करने के लिए यह पसंद नहीं होगा? क्या आखिरी टेक्स्ट बॉक्स में डेटा इतना लचीला है कि एक बार जब वे बटन पर क्लिक करते हैं तो इसे "याद किया जाता है"? या क्या आपके पास कुछ प्रकार का ऑपरेशन है कि बटन उस विशिष्ट टेक्स्ट बॉक्स डेटा पर करता है - उस स्थिति में फोकस इसके बाद के बाद के नियंत्रण में नहीं जाना चाहिए?

मुझे यह जानने में दिलचस्पी है कि आप इसे पहले स्थान पर क्यों करना चाहते हैं।

1

मुझे लगता है कि आप क्या कर रहे हैं ठीक है। एकमात्र चीज जिसे मैं सुधारने के बारे में सोच सकता हूं, वह प्रत्येक नियंत्रण को एक ढेर में स्टोर करना होगा क्योंकि उन्हें एक्सेस किया जा रहा है। इससे आपको जो भी एक्सेस किया गया था उसकी एक पूर्णकालिक रेखा मिल जाएगी।

1

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

private void Form_OnLoad(object obj, EventArgs e) 
{ 
    AddGotFocusListener(this); 
} 

private void AddGotFocusListener(Control ctrl) 
{ 
    foreach(Control c in ctrl.Controls) 
    { 
     c.GotFocus += new EventHandler(Control_GotFocus); 
     if(c.Controls.Count > 0) 
     { 
      AddGotFocusListener(c); 
     } 
    } 
} 

private void Control_GotFocus(object obj, EventArgs e) 
{ 
    // Set focused control here 
} 
0

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

2

आप किसी लेबल के लिए निम्न

बदलें बटन करते हैं और इसे एक बटन की तरह लग रहे बना सकता है। लेबल कभी फोकस नहीं करेगा और आपको सभी अतिरिक्त कोडिंग करने की ज़रूरत नहीं है।

0

टेक्स्टबॉक्स से प्राप्त कस्टमटेक्स्टबॉक्स नामक एक क्लास बनाएं। इसमें स्टैक नामक स्थिर चर है। जब टेक्स्टबॉक्स स्टैक पर फ़ोकस पुश खो देता है। जब आप अंतिम केंद्रित नियंत्रण ढूंढना चाहते हैं तो बस स्टैक से पहले आइटम को पॉप करें। स्थिर स्टैक वैरिएबल को साफ़ करना सुनिश्चित करें।

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