प्रदर्शन बॉक्स दो बार दिखा रहा है सी #

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

private void rChkBoxB_ToggleStateChanged(object sender, Telerik.WinControls.UI.StateChangedEventArgs args)
{
    if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
    {
        DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error", 
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        if (dialogresult == DialogResult.OK)
        {
            rChkBoxB.Checked = false;
        }
    }
}

क्लिक समस्या के बाद नई समस्या चेकबॉक्स को वापस झूठ में बदल रही है। मेरा अद्यतन कोड यहां है। ठेठ checkbox.checked = false इसे वापस गलत में नहीं बदलता है। मैंने यह सत्यापित करने के लिए ब्रेकपॉइंट का उपयोग किया कि मुझे अगर कथन में मिल रहा है और मूल्य मेरे चेकबॉक्स के लिए गलत कहता है। मैं संपत्ति को वापस गलत कैसे बदल सकता हूं?

private void rChkBoxB_Click(object sender, EventArgs e)
{
    if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
    {
        DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        if (dialogresult == DialogResult.OK)
        {
            rChkBoxB.Checked = false;
        }
    }
}
0
मेरा अनुमान है rChkBoxB_ToggleStateChanged दो बार बुलाया जाता है। इसे तोड़ो और इसे देखें।
जोड़ा लेखक logixologist, स्रोत

4 उत्तर

क्योंकि आपने संवाद के बदले चेकड = झूठी सेट की है? इसलिए, फिर से राज्य को तंग कर रहे हैं?

संपादित करें: ध्यान दें, आप शायद चेकस्टेट चेंज किए गए ईवेंट का उपयोग कर रहे हैं। तो, आप चेकबॉक्स (इसे सत्य पर सेट कर रहे हैं) की जांच करते हैं, यह आग लगती है, आप संदेशबॉक्स दिखाते हैं, आप चेकबॉक्स को वापस गलत पर सेट करते हैं, जो बदले में, ईवेंट को फिर से आग लगने का कारण बनता है (आप राज्य बदल रहे हैं)।

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

अंत में, क्लिक ईवेंट का उपयोग करें:

    private void rChkBoxB_Click(object sender, EventArgs e)
    {
        if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
        {
            DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            if (dialogresult == DialogResult.OK)
            {
                rChkBoxB.Checked = false;
            }
        }
    }

Of course, in either version of your code, I'm assuming you want to actually check if Text > 256 when you are checking it to true. So you might want to:

    private void rChkBoxB_Click(object sender, EventArgs e)
    {
        if (rChkBoxB.Checked == false) return;//NEW CODE HERE

        if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
        {
            DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            if (dialogresult == DialogResult.OK)
            {
                rChkBoxB.Checked = false;
            }
        }
    }
0
जोड़ा
मैंने इस तरह से सेट किया क्योंकि उस क्षेत्र के लिए यह सही होना आवश्यक है क्योंकि प्रारूप इसे संभाल नहीं सकता है। इसलिए इसे छोड़कर डेटाबेस को सही करने की अनुमति मिल जाएगी।
जोड़ा लेखक Kpt.Khaos, स्रोत
मैं संवाद के बाद यदि आप बच्चे नहीं हैं। ठीक है अगर मैं इसे सेट करता हूं तो चेकबॉक्स। चेक किया गया = गलत के बजाय सत्य चेकबॉक्स गलत है।
जोड़ा लेखक Kpt.Khaos, स्रोत
अगर मेरे पास if (checkbox.checked == false) वापसी का हिस्सा है। यह क्लिक होने पर भी हर बार लौटाता है। यह लगभग है जैसे झूठी और सत्य स्विच कर रहे हैं।
जोड़ा लेखक Kpt.Khaos, स्रोत
मुझे पता है कि यह काम करता है मैंने यह सुनिश्चित किया है। यदि कथन कार्य करता है तो मेरा सत्यापन करना, लेकिन अगर मैं इसे अपने सत्यापन बयान में शामिल करने का प्रयास करता हूं तो यह फिर से शुरू होता है और यह क्लिक ईवेंट में भी नहीं होता है।
जोड़ा लेखक Kpt.Khaos, स्रोत
यह WinForms परियोजना है। केवल एक और स्थान है लेकिन मैं सिर्फ एक कथन कथन चलाता हूं और यह चेकबॉक्स की स्थिति को नहीं बदलता है। यह एक बटन घटना से भी ट्रिगर हुआ है, इसलिए इसका कोई प्रभाव नहीं पड़ता है। हाँ यह अजीब है।
जोड़ा लेखक Kpt.Khaos, स्रोत
स्क्रीन शॉट्स ऊपर हैं।
जोड़ा लेखक Kpt.Khaos, स्रोत
हाँ मुझे स्क्रीन शॉट पोस्ट करने दें
जोड़ा लेखक Kpt.Khaos, स्रोत
बस यह देखकर हाँ काम करता है लेकिन चेकबॉक्स इसे निष्पादित करने के बाद चेक रहता है।
जोड़ा लेखक Kpt.Khaos, स्रोत
आपके लिए समीक्षा करने के लिए संपादित करें।
जोड़ा लेखक Kpt.Khaos, स्रोत
यह मुझे डबल अधिसूचना से छीनता है लेकिन यह चेकबॉक्स को गलत में नहीं बदलता है। मैं अपना कोड नए कोड के लिए अपडेट कर रहा हूं।
जोड़ा लेखक Kpt.Khaos, स्रोत
संपादन और आपकी मदद के लिए बहुत स्पष्ट धन्यवाद!
जोड़ा लेखक Kpt.Khaos, स्रोत
हां, इसलिए आपको उस स्थिति को संभालने की आवश्यकता है जहां आप इसे वापस टॉगल करते हैं।
जोड़ा लेखक JustLooking, स्रोत
अरे केपीटी Khaos - क्या आप निश्चित रूप से चेकबॉक्स के बारे में निश्चित हैं कि गलत पर सेट नहीं किया जा रहा है? संदेशबॉक्स प्रदर्शित होने के बाद, और फिर ठीक किया गया, चेकबॉक्स को वापस गलत पर सेट किया गया है (और क्लिक ईवेंट फिर से आग नहीं आता है)। यह काम करना चाहिए। मैंने अभी इसका परीक्षण किया है।
जोड़ा लेखक JustLooking, स्रोत
आपका स्वागत है। सौभाग्य!
जोड़ा लेखक JustLooking, स्रोत
क्या आपको यकीन है? मेरा परीक्षण अन्यथा कहता है। यदि आप परीक्षण विफल करते हैं (256 से अधिक संख्या), तो आप एक संदेशबॉक्स सही प्रस्तुत करते हैं? फिर, संदेशबॉक्स ठीक होने के बाद, कोड चेकबॉक्स को वापस गलत पर सेट करता है। जब मैं अपना फॉर्म देखता हूं (मैंने WinForms का उपयोग करके एक त्वरित परीक्षण किया था), चेकबॉक्स की स्थिति अनचेक है।
जोड़ा लेखक JustLooking, स्रोत
कुछ गायब जानकारी होनी चाहिए। उदाहरण के लिए, अभी यह करें: एक ब्रांड नई WinForms प्रोजेक्ट शुरू करें। फॉर्म 1 पर, एक चेकबॉक्स ड्रॉप करें। क्लिक घटना को वायर करें। क्लिक ईवेंट में कोड की एक पंक्ति डालें: चेकबॉक्स 1। जांच = झूठी; ... मैं गारंटी देता हूं कि हर बार जब आप चेकबॉक्स पर क्लिक करते हैं, तो यह अन-चेक किया जाता है। यह मूल रूप से वही कोड है जो हमने प्रदर्शित किया है (256 के लिए परीक्षण घटाएं और संदेशबॉक्स)।
जोड़ा लेखक JustLooking, स्रोत
ह्रम्म, यह समझ में नहीं आता है। यदि मैं चेकबॉक्स को गलत (क्लिक ईवेंट में) सेट करता हूं, तो यह GUI में दिखाई देता है। क्या यह WinForms प्रोजेक्ट या wpf या .. है? मैंने WinForms का उपयोग किया, शायद wpf के साथ कुछ अलग है। मुझे नहीं लगता कि हालांकि इससे कोई फर्क नहीं पड़ता। जैसा कि मैं इसके बारे में और सोचता हूं, शायद आपके द्वारा वायर्ड की गई कोई अन्य घटना है जो इसे सही पर सेट कर रही है? अपने सभी कार्यक्रमों को अन-तार करें, और केवल क्लिक ईवेंट छोड़ दें, मुझे लगता है कि यह काम करता है। या बस उस कोड में किसी भी स्थान पर ब्रेकपॉइंट डालें जिसे आपने चेकबॉक्स चेक किया हुआ मान सेट किया है।
जोड़ा लेखक JustLooking, स्रोत

Problem: ToggleStateChanged event will be fired whenever Checkbox state is being changed. Your checkbox state is getting changed when you set rChkBoxB.Checked = false; that is the reason why your ToggleStateChanged event is invoking twice.

Solution: Take a bool variable and make it true when user selects ok , then even if the ToggleStateChanged event triggers it wont invoke the function twice as isValid is set to true.

bool isValid=false;//declare as class variable

private void rChkBoxB_ToggleStateChanged(object sender, Telerik.WinControls.UI.StateChangedEventArgs args)
{
   if(!isValid)
   {
      if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
      {
         DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         if (dialogresult == DialogResult.OK)
         {
            rChkBoxB.Checked = false;
            isValid=true;
         }
         else
         {
            isValid=false;
         }
      }
   }
   else
   {
      isValid=false;
   }
}
0
जोड़ा
हां क्लिक ईवेंट के बाद मैं चेकबॉक्स को अनचेक करने के लिए = false का उपयोग करता हूं और यह कभी भी कार्रवाई नहीं करता है।
जोड़ा लेखक Kpt.Khaos, स्रोत
वह सही है।
जोड़ा लेखक Kpt.Khaos, स्रोत
हां मैंने ब्रेकपॉइंट का इस्तेमाल किया और यह पाया कि मान गलत है। यह सिर्फ चेकबॉक्स सेट नहीं करता है।
जोड़ा लेखक Kpt.Khaos, स्रोत
क्या आपको लगता है कि आप इस मुद्दे को हल करने के बारे में जानते हैं या नहीं, यह देखने के लिए आप मेरे संपादन को देख सकते हैं।
जोड़ा लेखक Kpt.Khaos, स्रोत
कोशिश करने के लिए मुझे एक सेकंड दें लेकिन मुझे लगता है कि आपके पास कुछ हो सकता है।
जोड़ा लेखक Kpt.Khaos, स्रोत
वह काम नहीं किया।
जोड़ा लेखक Kpt.Khaos, स्रोत
मेरे संपादन की जांच करें अब आपको गलत पर सेट करने के लिए isvalid सेट करने के लिए और अधिक ब्लॉक जोड़ने की आवश्यकता है
जोड़ा लेखक Sudhakar Tillapudi, स्रोत
@ Kpt.Khaos: तो जब आपका चेकबॉक्स चेक किया जाएगा तो imean सत्य पर सेट किया जाएगा?
जोड़ा लेखक Sudhakar Tillapudi, स्रोत
@ Kpt.Khaos: तो अब आपकी समस्या है: चेकबॉक्स हमेशा चेक किया जाता है (मेरा मतलब सच है) यह कभी भी गलत नहीं है (अनचेक) भले ही आप MessageBox पर ठीक क्लिक करें?
जोड़ा लेखक Sudhakar Tillapudi, स्रोत
@ Kpt.Khaos: क्या आप वाकई यह सुनिश्चित कर रहे हैं कि यह स्थिति दर्ज कर रहा है और संदेशबॉक्स प्रदर्शित कर रहा है?
जोड़ा लेखक Sudhakar Tillapudi, स्रोत

The code is not the problem, but the event ToggleStateChanged being called more than one time when rChkBoxB.Checked = false;

0
जोड़ा
क्या आपको लगता है कि आप इस मुद्दे को हल करने के बारे में जानते हैं या नहीं, यह देखने के लिए आप मेरे संपादन को देख सकते हैं।
जोड़ा लेखक Kpt.Khaos, स्रोत

यह दो बार चलता है क्योंकि आप रेडियो बटन के अंदर चेक की गई संपत्ति को बदलते हैं। जब आप इसे बदलते हैं तो सीआईएल देखता है कि यह एक नया झंडा उत्पन्न करता है और यह फिर से घटना करता है।

इसकी उम्मीद के लिए आप पहले में दूसरा नियंत्रण डाल सकते हैं यदि

if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256 && rChkBoxB.Checked)
{
  ///TODO
}

मैं यह भी जांचने का सुझाव देता हूं कि इनपुट सही है या नहीं: इस मामले में आप केवल int चाहते हैं ताकि आप int.TryParse (स्ट्रिंग, आउट int) का उपयोग कर सकें (संदर्भ यहां ) या आप Regex (संदर्भ यहां )

0
जोड़ा