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

मैंने उपयोगकर्ता सेटिंग्स में गुण जोड़े हैं और नीचे दिए गए कोड को लागू किया है, लेकिन जब मैं एक नंबर इनपुट करता हूं और एप्लिकेशन को फिर से खोलता हूं, तो कुछ भी नहीं दिखाया जाता है और वे user.config फ़ाइल में सहेजे नहीं जाते हैं।

किसी भी मदद की बहुत सराहना की जाती है क्योंकि मुझे अपनी गलती नहीं मिल रही है।

       private void MainForm_Load(object sender, EventArgs e)
       {
           Text = Properties.Settings.Default.title;
           chkBox1.Checked = Properties.Settings.Default.checkBox;
           chkBox2.Checked = Properties.Settings.Default.checkBox;
           chkBox3.Checked = Properties.Settings.Default.checkBox;
           txtBox1.Text = Properties.Settings.Default.textBox;
           txtBox2.Text = Properties.Settings.Default.textBox;
           txtBox3.Text = Properties.Settings.Default.textBox;
           this.Location = new System.Drawing.Point(Properties.Settings.Default.PX, Properties.Settings.Default.PY);
       }
       private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
       {
           Properties.Settings.Default.checkBox = chkBox1.Checked;
           Properties.Settings.Default.checkBox = chkBox2.Checked;
           Properties.Settings.Default.checkBox = chkBox3.Checked;
           Properties.Settings.Default.textBox = txtBox1.Text;
           Properties.Settings.Default.textBox = txtBox2.Text;
           Properties.Settings.Default.textBox = txtBox3.Text;
           Properties.Settings.Default.PX = this.Location.X;
           Properties.Settings.Default.PY = this.Location.Y;
           Properties.Settings.Default.Save();

       }

       private void chkBox1_Checked(object sender, EventArgs e)
       {
           this.Text = txtBox1.Text;
       }

       private void chkBox2_Checked(object sender, EventArgs e)
       {
           this.Text = txtBox2.Text;
       }

       private void chkBox3_Checked(object sender, EventArgs e)
       {
           this.Text = txtBox3.Text;
       }

2
Lisa Maria 18 अगस्त 2020, 11:59

2 जवाब

सबसे बढ़िया उत्तर

मेरे उत्तर का पहला भाग, इस तथ्य के संबंध में कि जब आप अपना आवेदन बंद करते हैं तो कुछ भी सहेजा नहीं जाता है, इस धारणा पर आधारित है कि परीक्षण करते समय, आप तीसरे टेक्स्टबॉक्स को खाली छोड़ देते हैं खाली

कुछ भी क्यों नहीं बचा है

पहला यह है कि आप अपना आवेदन खोलते समय कुछ भी नहीं देख रहे हैं, जिससे आपको विश्वास हो जाता है कि इसे बंद करते समय कुछ भी सहेजा नहीं गया था।

आप अपने कोड के हिस्से में हैं कि आपका एप्लिकेशन बंद होने पर क्या होता है, समान सेटिंग में सभी टेक्स्टबॉक्स (और चेकबॉक्स राज्यों) को सहेजते हैं।

जो निम्न की ओर जाता है txtBox1 में एक txtbox2 होता है जिसमें कुछ भी नहीं होता है (या यदि आप चाहें तो एक खाली स्ट्रिंग)

सहेजते समय, आपके कोड के साथ क्या हो रहा है कि पहले चरण में, आप अपने टेक्स्टबॉक्स सेटिंग में "ए" डाल रहे हैं।

फिर, आप इस वील्यू को दूसरे टेक्स्टबॉक्स की सामग्री से प्रतिस्थापित कर रहे हैं, जो खाली है

(तीसरे टेक्स्टबॉक्स के लिए दोहराएं)

आप बचत कर रहे हैं... एक खाली मूल्य।

यदि आप इसे "बेवकूफ" तरीके से ठीक करना चाहते हैं, तो आपको प्रति टेक्स्टबॉक्स और चेकबॉक्स के लिए एक सेटिंग की आवश्यकता होगी।

जो आपके क्लोजिंग इवेंट हैंडलर में कोड जैसा दिखता है

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
   {
       Properties.Settings.Default.checkBox1 = chkBox1.Checked;
       Properties.Settings.Default.checkBox2 = chkBox2.Checked;
       Properties.Settings.Default.checkBox3 = chkBox3.Checked;
       Properties.Settings.Default.textBox1 = txtBox1.Text;
       Properties.Settings.Default.textBox2 = txtBox2.Text;
       Properties.Settings.Default.textBox3 = txtBox3.Text;
       Properties.Settings.Default.PX = this.Location.X;
       Properties.Settings.Default.PY = this.Location.Y;
       Properties.Settings.Default.Save();
   }

मैं "बेवकूफ" क्यों कहता हूं, क्योंकि जैसा कि आप निश्चित रूप से समझ चुके हैं, यह दृष्टिकोण बड़ी संख्या में नियंत्रणों के लिए टिकाऊ नहीं है, लेकिन यह प्रश्न का दायरा नहीं है, मैं आपको अपने लिए एक समाधान का शोध करने देता हूं यह विशेष बिंदु।

क्या सहेजा गया है यह निर्धारित करने के लिए चेकबॉक्स कुछ भी क्यों नहीं कर रहा है

सबसे पहले, Winforms पर उपलब्ध घटनाओं के साथ (कम से कम .NET Framework 4.5 के साथ जो मैंने आपके पास पुन: पेश करने के लिए उपयोग किया था) चेकबॉक्स राज्य परिवर्तन की अधिसूचना के लिए उपलब्ध एकमात्र घटनाएं हैं:

  • चेक किया गयाबदला हुआ
  • चेकस्टेट बदल गया

पहले का उपयोग बाइनरी चेकबॉक्स पर किया जाता है (चेक किया गया है या नहीं) दूसरा चेकबॉक्स पर अनिश्चित स्थिति के साथ अन्य दोनों राज्यों में जोड़ा गया है।

मुझे लगता है कि आपने दोनों में से पहले का उपयोग किया था (क्योंकि वह डिफ़ॉल्ट रूप से विजुअल स्टूडियो द्वारा उपयोग किया जाता है जब डिज़ाइनर में उस पर डबल क्लिक किया जाता है)।

यहां पहला मुद्दा यह है कि यह आपको सूचित करता है कि राज्य बदल गया न केवल यह कि यह अनियंत्रित से चेक में चला गया, बल्कि दूसरी तरफ भी।

इसका मतलब है कि यदि आप केवल जांच करते समय कोई कार्रवाई करना चाहते हैं, तो आपको उन मामलों को छोड़ने के लिए एक... चेक (एक अगर ब्लॉक) जोड़ना होगा, जिनमें आपकी रुचि नहीं है।

अगला वास्तविक बचत है।

आप अपने कोड में जो कर रहे हैं वह सिर्फ आपकी कक्षा में किसी संपत्ति में टेक्स्टबॉक्स मानों की प्रतिलिपि बना रहा है, और यह एप्लिकेशन बंद करने के बाद नहीं जारी रहेगा।

अब दो दृष्टिकोण हैं जिनका उपयोग आप उन मानों को सेटिंग्स में सहेजने के लिए कर सकते हैं, पहला यह है कि जैसे ही आप बॉक्स को चेक करते हैं, इसे करें।

फिर आपको क्या करना होगा प्रत्येक ईवेंट हैंडलर के लिए टेक्स्टबॉक्स के मूल्य की प्रतिलिपि बनाना .... सीधे सेटिंग्स में

पहले टेक्स्टबॉक्स और चेकबॉक्स के लिए एक उदाहरण:

private void chkBox1_Checked(object sender, EventArgs e)
{
    if(chkBox1.Checked)
    {
        Properties.Settings.Default.checkBox1 = chkBox1.Checked;
    }
}

हालांकि मैं बहुत बड़ा प्रशंसक नहीं हूं, और दूसरे समाधान => को क्लोजिंग इवेंट में जांचना पसंद करूंगा, टेक्स्टबॉक्स से मूल्य को सेटिंग्स में कॉपी करने से पहले, यदि संबंधित चेकबॉक्स बंद है।

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (this.chkBox1.Checked)
        {
            Properties.Settings.Default.textBox = txtBox1.Text;
        }
        [...]
    }

अब वह थोड़ा बेहतर है, और इरादा के अनुसार काम करना चाहिए।

कृपया ध्यान दें कि यह उत्तर आपके मूल कोड के निकटतम संभव समाधानों का उपयोग करते हुए समस्या को ठीक करने की दिशा में उन्मुख है।

1
Sidewinder94 18 अगस्त 2020, 13:09

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

नियंत्रण डेटा बाइंड के लिए मेरे पास सबसे अच्छा स्पष्टीकरण यह है कि वे नियंत्रण गुणों और ऑब्जेक्ट गुणों के बीच दो तरह का मॉडल अपडेट प्रदान करते हैं। अधिक जानकारी https: //docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.databindings?view=netcore-3.1

private void Form1_Load(object sender, EventArgs e)
        {
            chkBox1.DataBindings.Add("Checked", Properties.Settings.Default, "Checked1",true, DataSourceUpdateMode.OnPropertyChanged);
            chkBox2.DataBindings.Add("Checked", Properties.Settings.Default, "Checked2",true, DataSourceUpdateMode.OnPropertyChanged);
            chkBox3.DataBindings.Add("Checked", Properties.Settings.Default, "Checked3",true, DataSourceUpdateMode.OnPropertyChanged);
             //you can others
          
            
        }
       
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //don't forget to call save on form closing
            Properties.Settings.Default.Save();
        }
3
Ikenna Emman 18 अगस्त 2020, 12:56