2008-11-24 13 views
22

मेरे पास एक ऐसे फॉर्म के शीर्ष पर एक combobox है जो नीचे फ़ील्ड में संपादन योग्य डेटा लोड करता है। यदि उपयोगकर्ता ने बदलाव किए हैं, लेकिन सहेजे नहीं गए हैं, और combobox से एक अलग विकल्प चुनने का प्रयास करता है, तो मैं उन्हें चेतावनी देना चाहता हूं और उन्हें रद्द या सहेजने का मौका देता हूं।सी # में एक combobox के मूल्य परिवर्तन को रोकने/रद्द करने के लिए कैसे?

मुझे रद्द करने योग्य ईवेंट तर्क के साथ "पहले वैल्यू चेंज" ईवेंट की आवश्यकता है।

कैसे पूरा करने के बारे में कोई सलाह?

उत्तर

0

आप क्लिक और कुंजी प्रेस को रोकने के लिए message filter का उपयोग कर सकते हैं, जो आपको कॉम्बो बॉक्स के सामान्य व्यवहार को रोकने की अनुमति देगा। लेकिन मुझे लगता है कि उपयोगकर्ता कॉम्बो बॉक्स को अक्षम करने से बेहतर होगा, जब उपयोगकर्ता कोई बदलाव करता है, और उन्हें अपने परिवर्तनों को सहेजने या वापस करने की आवश्यकता होती है।

2

सत्यापित किया जा रहा घटना इस परिदृश्य
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

+2

यह तब होता है के बाद आप फोकस खो देते हैं, तो काम नहीं करेगा। मुझे एक ऐसा ईवेंट चाहिए जो "पहले" होता है जब उपयोगकर्ता मूल्य बदलने की कोशिश करता है। –

+0

@ आरजी - क्या आप फोकस को कॉम्बो बॉक्स पर वापस सेट नहीं कर सकते हैं, या क्या यह कुछ प्रसंस्करण हो रहा है जब यह फोकस खो देता है? –

1

के लिए इस्तेमाल किया जा सकता आप डिफ़ॉल्ट रूप से एक उपयुक्त घटना नहीं मिलता है। यदि आप रद्द करना चाहते हैं तो आप पिछले मान को कैश कर सकते हैं और इसे वापस सेट कर सकते हैं।

3

वर्तमान मूल्य को Enter ईवेंट पर सहेजें। वास्तविक ValueChanged तर्क से पहले, ValueChanged ईवेंट में BeforeValueChange तर्क लागू करें। यदि उपयोगकर्ता रद्द करता है, संग्रहीत मान सेट करें और विधि में जारी न रखें (return)।

यदि आप इस प्रणाली का उपयोग करने जा रहे हैं, तो मैं वहां कॉम्बोबॉक्स को विरासत देने और आपके BeforeValuechange ईवेंट को लागू करने का सुझाव दूंगा।

1

मान्य/मान्य घटनाओं का उपयोग करने के बारे में कैसे?
यह अच्छी तरह से काम करता है, अगर परिवर्तन के बदले लॉस्टफोकस पर होने वाली घटना आपके साथ ठीक है।

अन्यथा, कैसे के बारे में

public void Combobox_ValueChanged(object sender, EventArgs e) { 
    if (!AskUserIfHeIsSureHeWantsToChangeTheValue()) 
    { 
     // Set previous value 
     return; 
    } 

    // perform rest of onChange code 
} 
16

सहेजें ComboBox के SelectedIndex जब अगर पहले दर्ज बॉक्स, और उसके बाद जब आप परिवर्तन रद्द करने की आवश्यकता यह मूल्य है बहाल करने के लिए।

cbx_Example.Enter += cbx_Example_Enter; 
cbx_Example.SelectionChangeCommitted += cbx_Example_SelectionChangeCommitted; 

... 

private int prevExampleIndex = 0; 
private void cbx_Example_Enter(object sender, EventArgs e) 
{ 
    prevExampleIndex = cbx_Example.SelectedIndex; 
} 

private void cbx_Example_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    // some custom flag to determine Edit mode 
    if (mode == FormModes.EDIT) 
    { 
     cbx_Example.SelectedIndex = prevExampleIndex; 
    } 
} 
+0

इस तरह मैंने इसे हमेशा किया है, और यह अपेक्षा के अनुसार काम करता है। –

+1

यह चयन चयन घटना के बदले में एक आदर्श समाधान है। धन्यवाद!! - मैथ्यू –

+2

अंतिम चयन को सहेजने के लिए 'एंटर' ईवेंट का उपयोग करना आवश्यक नहीं है। 'चयन चयन संमिश्र' ईवेंट हैंडलर से बाहर निकलने से पहले, 'प्राइवेट सिलेक्टेड इंडेक्स' मान को 'निजी' चर के रूप में सहेजें। इसके बाद, उस ईवेंट हैंडलर में आने वाली प्रविष्टियां 'अंतिम चयन किए गए इंडेक्स' का उपयोग कर सकती हैं ताकि 'कॉम्बोबॉक्स। चयनित इंडेक्स' को पिछली स्थिति में सेट किया जा सके। –

4

यहाँ सबसे सरल ठीक है: -

 bool isSelectionHandled = true; 

     void CmbBx_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (isSelectionHandled) 
      { 
       MessageBoxResult result = MessageBox.Show("Do you wish to continue selection change?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question); 
       if (result == MessageBoxResult.No) 
       { 
        ComboBox combo = (ComboBox)sender; 
        isSelectionHandled = false; 
        if (e.RemovedItems.Count > 0) 
         combo.SelectedItem = e.RemovedItems[0]; 
        return; 
       } 
      } 
      isSelectionHandled = true; 
     } 
+0

इस घटना 'चयन चेंज' क्या है? क्या यह WinForm कॉम्बोबॉक्स से है। – i486

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