2009-04-24 14 views
13

मुझे एक छोटी सी समस्या है जो मुझे कुछ घंटों तक परेशान कर रही है।कॉम्बोबॉक्स का एडिटबॉक्स भाग स्वचालित रूप से चुना जाता है

मेरी WinForms (.NET 3.5) आवेदन में मैं क्रम में एक TableLayoutPanel में कुछ comboboxes (DropDownStyle = लटकती) बना सकते हैं और तार के साथ भरें। कॉम्बोबॉक्स स्वचालित रूप से आकार बदलने के लिए कॉन्फ़िगर किए गए हैं (एंकर = बाएं | दाएं)।

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

समस्या नहीं दिखाई देती है यदि कॉम्बोबॉक्स का एक निश्चित आकार है।

यह भी ध्यान रखें कि DropDownStyle को बदलने का विकल्प नहीं है - मुझे मैन्युअल रूप से टेक्स्ट दर्ज करने की संभावना है।

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

क्या इस समस्या का बेहतर समाधान है?

अग्रिम धन्यवाद।

सादर, एंडी

+0

पाठ भाग संपादन योग्य नहीं है। क्या आपका मतलब ड्रॉपडाउन था? –

उत्तर

13

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

foreach (var cb in Controls.OfType<ComboBox>()) 
    { 
     cb.Resize += (sender, e) => { 
      if (!cb.Focused) 
       cb.SelectionLength = 0; 
     }; 
    } 

जानबूझकर चयनित पाठ का चयन रद्द हो गया

यह WinForms बग चयनित comboboxes को प्रभावित नहीं करता, फोकस के साथ लोगों की अनदेखी करके हां, तो हम वर्तमान चयन को खोने की समस्या का ख्याल रखना।

मैं अपने संवाद पर प्रत्येक और हर ComboBox करने के लिए ईवेंट हैंडलर जोड़ना होगा।

फ़ोरैच लूप द्वारा देखभाल की गई। यदि आप डिज़ाइनर को तोड़ना नहीं चाहते हैं, या डिज़ाइनर को तोड़ना है तो इसे InitializeComponent() या अपने .ctor में रखें।

वहाँ झिलमिलाहट

मैं केवल झिलमिलाहट दिखाई दे रही है अगर मैं बहुत तेजी से आकार परिवर्तन का एक बहुत कुछ था, लेकिन मैं Win7 पर हूँ तो यह XP पर अलग हो सकता है।

+0

मैं ऐसा करने का सुझाव देना चाहता था। चयन करें अगला नियंत्रण या एक combobox.SelectNextControl –

+0

इसके लिए धन्यवाद। यह थोड़ी देर के लिए मुझे परेशान कर रहा है और केवल अभी इसे ठीक करने के लिए दौर मिला है। मेरे ऐप में प्रत्येक कॉम्बो-बॉक्स प्रकार नियंत्रण मूल वस्तु से प्राप्त होता है (इसलिए मेरे पास एक लेबल, सामान्य विधियां आदि हो सकती हैं)। कॉम्बो बॉक्स के लिए ऑनरिजिज इवेंट हैंडलर में डालने से इसे फिर से शुरू करने के बजाए मेरी समस्या को संबोधित किया गया है। धन्यवाद! –

2

वाह। आप लोगों को धन्यवाद!

स्पष्ट रूप से यह बग कई वर्षों तक जारी रहा है। मैं .NET 4 (विजुअल स्टूडियो 2010) के साथ UserControl बना रहा हूं। यहां बीएसनीज़ कोड का मेरा मामूली संशोधित संस्करण है।

चीयर्स

using System.Windows.Forms; 
using System.Linq; 

public MyUserControlCtor() 
{ 
    InitializeComponent(); 

    foreach(Control ctrl in Controls) 
    { 
     ComboBox cb = ctrl as ComboBox; 
     if (cb != null) 
     { 
      cb.Resize += (sender, e) => 
      { 
       if (!cb.Focused) 
        this.FCHZ_ComboBox.SelectionLength = 0; 
      }; 
     } 
    } 
} 
+0

मुझे यह नोटेशन बहुत बेहतर लगता है foreach (नियंत्रण में var cb controls.OfType ()) – CodingBarfield

0

मैं आकार बदलने घटना पर कॉम्बो बॉक्स के लिए 0 करने के लिए चयन लंबाई की स्थापना पाया जो कुछ भी की पर नियंत्रण कॉम्बो बॉक्स कारणों पर एक बहुत कम के बजाय अस्थिर पर यह क्या कर रही है कॉम्बो का आकार बदलना।

मैंने वास्तव में इसे वीबी.Net में हासिल किया लेकिन इसे सी # पर लागू करना चाहिए।

1

अब तक मेरे कोई भी जवाब मेरे लिए काम नहीं करता है। मुझे मिली एकमात्र विश्वसनीय विधि BeginInvoke के माध्यम से एक संदेश को अतुल्यकालिक रूप से पोस्ट करना था जो नियंत्रण पर सभी अन्य गतिविधियों के पूरा होने के बाद SelectionLength शून्य पर वापस सेट करता है। झिलमिलाहट की मात्रा बहुत परेशान और गैर-व्यावसायिक है, लेकिन यह सबसे अच्छा है जिसके साथ मैं आ सकता हूं ... अब तक।

internal class FixedComboBox : ComboBox 
{ 
    protected override void OnResize(EventArgs e) 
    { 
     if (IsHandleCreated && !Focused) 
     { 
      BeginInvoke((Action)(() => 
       { 
        SelectionLength = 0; 
       })); 
     } 
     base.OnResize(e); 
    } 
} 
+0

मुझे आश्चर्य है कि क्या अन्य उत्तरों यहां आपके लिए काम नहीं करते हैं क्योंकि आपका 'कॉम्बोबॉक्स' 'TableLayoutPanel' में था? –

+0

@ जेफरो: मुझे विवरण याद नहीं है। यह बहुत समय पहले था, लेकिन हाँ, यह बहुत संभव है। –

0

कॉम्बोबॉक्स के मूल कंटेनर के लिए आकार बदलने का आयोजन संभाल लें। आप के लिए

Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles Me.Resize 

    MyComboBox.SelectionLength = 0 

End Sub 

गुड लक: वहाँ में इस लाइन रखो:

MyComboBox.SelectionLength = 0

एक उदाहरण (वीबी, जाहिर है)!

--BP

0

यह DropDown की DropDownStyle साथ ComboBox के देशी विंडोज कार्यान्वयन में एक बग प्रतीत होता है।

ठीक यहाँ अन्य उत्तर में दिए गए विवरण (ComboBox के Resize घटना में 0 (शून्य करने के लिए SelectionLength संपत्ति) की स्थापना) अच्छी तरह से समय की सबसे काम करता है।

हालांकि, मैंने पाया कि यह बग के आसपास काम करने के लिए भी ठीक काम नहीं करता है। यदि ComboBoxTableLayoutPanel में है, और यदि TableLayoutPanel में Percent आकार प्रकार के साथ एक से अधिक कॉलम हैं, तो यह फ़िक्स अक्सर काम नहीं करता है।

एक तस्वीर हजारों शब्दों के लायक है। समस्या का प्रदर्शन करने के लिए किए गए फॉर्म के निम्न स्क्रीन शॉट को देखें। जब आप DropDownList का उपयोग

enter image description here

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