2010-02-13 9 views
13

मैं विंडोज़ के व्यवहार को संशोधित करने की कोशिश कर रहा हूं। फोरम कॉम्बोबॉक्स ताकि ऑटोकंपलेट ड्रॉप डाउन आइटम जो मैं निर्दिष्ट नियमों के अनुसार प्रदर्शित करता हूं।Winforms को ओवरराइड करें कॉम्बोबॉक्स स्वत: पूर्ण सुझाव नियम

डिफ़ॉल्ट रूप से, यदि आप कॉम्बोबॉक्स में ऑटोकंपलेट का उपयोग करते हैं, तो नियम का पालन किया जाता है "स्ट्रिंग एस ड्रॉप डाउन में शामिल है अगर (एस। स्टर्ट्स विथ (उपयोगकर्ता एंटरटेक्स्टइन द कॉम्बोबॉक्स))" मैं वास्तव में एक नया विकल्प बदल रहा हूं वर्तमान के लिए नियम, लेकिन मुझे इसे पाने का कोई रास्ता नहीं मिल सकता है। (विशेष रूप से, मैं s.StartsWith के बजाय एस। कॉन्टैन्स पसंद करूंगा।)

मैं एक के बजाय दो नियंत्रणों का उपयोग करके एक बेकार समाधान को जोड़ सकता हूं, लेकिन मैं वास्तव में जो चाहता हूं वह वास्तव में खुश होगा ।

अपडेट: मुझे कुछ और खोज के बाद अनिवार्य रूप से the same question मिला। वहां दिए गए उत्तर से पता चलता है कि "नकली इसे" करने के लिए दो नियंत्रणों का उपयोग करना रास्ता है।

उत्तर

2

विंडोज विस्टा से पहले, स्वत: पूर्ण ऑब्जेक्ट match candidates with prefix only, तो आपको cook your own की आवश्यकता है।

यदि आपको दिखाई देने पर सुझाव सूची को रीसेट करने की आवश्यकता है, तो use IAutoCompleteDropDown::ResetEnumerator

+0

कैसे एक WinForms – ca9163d9

17

मुझे एक ही समस्या है और एक त्वरित समाधान की तलाश में है।

आखिर में मैंने इसे स्वयं लिखना समाप्त कर दिया। यह थोड़ा गंदा है लेकिन जरूरत पड़ने पर इसे सुंदर बनाना कठिन नहीं होना चाहिए।

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

बस null को combo.Tag स्थापित करने के लिए है, तो आप फिर से निर्माण याद कॉम्बो की विकल्प सूची।

private void combo_KeyPress(object sender, KeyPressEventArgs e) { 
    comboKeyPressed(); 
} 

private void combo_TextChanged(object sender, EventArgs e) { 
    if (combo.Text.Length == 0) comboKeyPressed(); 
} 

private void comboKeyPressed() { 
    combo.DroppedDown = true; 

    object[] originalList = (object[])combo.Tag; 
    if (originalList == null) { 
     // backup original list 
     originalList = new object[combo.Items.Count]; 
     combo.Items.CopyTo(originalList, 0); 
     combo.Tag = originalList; 
    } 

    // prepare list of matching items 
    string s = combo.Text.ToLower(); 
    IEnumerable<object> newList = originalList; 
    if (s.Length > 0) { 
     newList = originalList.Where(item => item.ToString().ToLower().Contains(s)); 
    } 

    // clear list (loop through it, otherwise the cursor would move to the beginning of the textbox...) 
    while (combo.Items.Count > 0) { 
     combo.Items.RemoveAt(0); 
    } 

    // re-set list 
    combo.Items.AddRange(newList.ToArray()); 
} 
+0

के लिए सी # में लिखने के लिए मैंने किया है, लेकिन मैं इस लाइन बढ़ना चाहिए "combo.DroppedDown = true" समारोह की आखिरी पंक्ति होने के लिए। अन्यथा यह अंतिम आइटम को हटाने का प्रयास करते समय अपवाद फेंकता है "combo.Items.RemoveAt (0);" – Ehsan

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