2013-01-23 76 views
7

यहाँ के साथ काम नहीं करता है एक छोटी कार्यक्रम है कि समस्या का सामना करना पड़ा मैं सिर्फ पुनरुत्पादित करता है। यह एमएस विंडोज 7 के तहत .NET 4.0 के साथ संकलित किया गया था, बस एक फर्क पड़ता है।ComboBox SelectionChangeCommitted घटना स्वत: पूर्ण

using System; 
using System.Drawing; 
using System.Windows.Forms; 

// Compile with "csc /target:exe /out:comboboxbug.exe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll comboboxbug.cs" 
// in a Visual Studio command prompt. 

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     //Create a label. 
     Label oLabel = new Label(); 
     oLabel.Location = new Point (10, 10); 
     oLabel.Size = new Size (100, 15); 
     oLabel.Text = "Combo box bug:"; 

     // Create a combo-box. 
     ComboBox oComboBox = new ComboBox(); 
     oComboBox.Location = new Point (10, 50); 
     oComboBox.Size = new Size (150, 21); 
     oComboBox.Items.AddRange (new object[] 
      { "A", "A B", "A C", "A B C", "A C B", "A B C D", "A C B D" }); 
     oComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
     oComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 
     oComboBox.SelectionChangeCommitted 
      += new EventHandler (comboBox_SelectionChangeCommitted); 

     // Create a form. 
     Form oForm = new Form(); 
     oForm.Size = new Size (200, 150); 
     oForm.Controls.Add (oLabel); 
     oForm.Controls.Add (oComboBox); 

     // Run this form. 
     Application.Run (oForm); 
    } 
    static void comboBox_SelectionChangeCommitted (object sender, 
     EventArgs e) 
    { 
     MessageBox.Show ("SelectionChangeCommitted"); 
    } 
} 

कॉम्बो-बॉक्स के टेक्स्ट हिस्से में क्लिक करें और "ए" टाइप करें। आपको स्वत: पूर्ण सुझावों की एक सूची मिल जाएगी। अपने माउस के साथ चयन में से एक पर क्लिक करें। SelectionChangeCommitted घटना नहीं होती है!

स्वत: पूर्ण का उपयोग किए बिना एक मेनू आइटम का चयन करें। आप दिखा रहा है कि SelectionChangeCommitted घटना हुआ संदेश बॉक्स मिल जाएगा!

यह देखते हुए कि चयन दोनों ही मामलों में उपयोगकर्ता द्वारा बदला गया था, SelectionChangeCommitted दोनों ही मामलों में नहीं बुलाया जाना चाहिए?

SelectedIndexChanged ईवेंट का उपयोग करना एक विकल्प नहीं है, क्योंकि इस डिब्बाबंद उदाहरण के पीछे आवेदन के लिए, मैं केवल तभी होता हूं जब उपयोगकर्ता चयन करता है, न कि जब यह प्रोग्रामेटिक रूप से सेट होता है।

+0

मैंने आपके कोड की कोशिश की लेकिन हर चीज ठीक है। – spajce

+0

कोई मौका [इस मुद्दे] (http://stackoverflow.com/questions/13291945/winforms-combobox-loses-autocomplete-value-on-lostfocus) बिल्कुल मदद करता है? – Guvante

+0

@spajce: मैंने उदाहरण स्रोत कोड को लिखा है और वर्णित व्यवहार को डुप्लिकेट किया है। विन 8, वीएस 2010, .NET 4 क्लाइंट प्रोफाइल। ध्यान दें कि स्वतः पूर्ण होने के हिस्से के रूप में मूल्य का चयन करते समय अपेक्षित व्यवहार पॉप अप होता है। – Guvante

उत्तर

2

SelectedIndexChanged घटना का उपयोग करते हुए एक विकल्प है, क्योंकि यह डिब्बाबंद उदाहरण के पीछे आवेदन के लिए, मैं सिर्फ यह तो होना ही है जब उपयोगकर्ता एक चयन, जब नहीं यह प्रोग्राम के रूप में सेट है बनाता चाहते हैं नहीं है।

आप अपने ईवेंट को अस्थायी रूप से अक्षम करने वाले चयन को बदलने के लिए एक रैपर विधि लिखकर इसे भी पूरा कर सकते हैं।

दुर्भाग्यवश मुझे इस मुद्दे का समाधान नहीं पता है कि SelectionChangeCommitted अधिक सामान्य मामले (जैसे कि आप ComboBox या इसे कैसे एक्सेस किया जाता है) के लिए शुरू नहीं किया जा रहा है।

संपादित करें:

मैं सभी घटनाओं है कि कॉल बता गया की एक स्ट्रीमर बनाया है, और यह प्रकट नहीं होता है कि किसी भी अन्य घटना आप के लिए क्या देख रहे हो जाएगा। एकमात्र समाधान मैं के बारे में सोच सकते हैं कि घटनाओं स्वत: पूर्ण चलाता है में hooking शामिल होगा। कठिनाई जानना है कि क्या उन घटनाओं रहे हैं, क्योंकि वे क्या मेरे नाबालिग परीक्षण से पता चलता से ComboBox बंद ट्रिगर कर सकते हैं नहीं है।

1

एफवाईआई, यहां सबसे अच्छा समाधान था जो मैंने कभी किया था। जाहिर है, यह कॉम्बोबॉक्स उप-वर्ग पर एक छुट्टी कार्यक्रम-हैंडलर है। SelectionChangeCommitted ईवेंट माउस-क्लिक पर नहीं होता है, लेकिन कम से कम यह GUI इंटरैक्शन के सामान्य प्रवाह के दौरान होता है।

private void this_Leave (object sender, EventArgs e) 
{ 
    // If this is an autocomplete combo-box, select the 
    // item that was found by autocomplete. 
    // This seems like something that ComboBox should be 
    // doing automatically...I wonder why it doesn't? 
    if (this.AutoCompleteMode != AutoCompleteMode.None) 
    { 
     // Determine which combo-box item matches the text. 
     // Since IndexOf() is case-sensitive, do our own 
     // search. 
     int iIndex = -1; 
     string strText = this.Text; 
     ComboBox.ObjectCollection lstItems = this.Items; 
     int iCount = lstItems.Count; 
     for (int i = 0; i < iCount; ++i) 
     { 
      string strItem = lstItems[i].ToString(); 
      if (string.Compare (strText, strItem, true) == 0) 
      { 
       iIndex = i; 
       break; 
      } 
     } 

     // If there's a match, and this isn't already the 
     // selected item, make it the selected item. 
     // 
     // Force a selection-change-committed event, since 
     // the autocomplete was driven by the user. 
     if (iIndex >= 0 
     && this.SelectedIndex != iIndex) 
     { 
      this.SelectedIndex = iIndex; 
      OnSelectionChangeCommitted (EventArgs.Empty); 
     } 
    } 
} 
0

अगर किसी को इस समस्या है, मेरा सुझाव है एक समाधान है कि मेरे पास ठीक काम करता है ...

मेरे साथ लगता है, स्वीकार करने के लिए कॉम्बो बॉक्स का सुझाव देते हैं, आम तौर पर उपयोगकर्ता के साथ कम करें कुंजी करने की जरूरत है एक कुंजी कुंजी।

आप कॉम्बो बॉक्स संपत्ति, कुछ इस तरह की KeyDown घटना में लिख सकते हैं:

private void cboProperty_SelectionChangeCommitted(object sender, EventArgs e) 
    { 
     //Call here the event of SelectionChangeCommitted 
     cboProperty_SelectionChangeCommitted(sender,null); 
    } 

यह सही समय पर SelectionChangeCommitted बढ़ा देंगे।

+0

उपयोगकर्ता भी फॉर्म के दूसरे भाग पर काम करना शुरू कर सकता है, और बिल्कुल भी नीचे नहीं। साथ ही, क्या आपकी 'cboProperty_SelectionChangeCommitted()' विधि स्वयं कॉलिंग है? क्या वह अनंत लूप नहीं है? – ulatekh