2010-07-07 8 views
6

मेरे पास एक जटिल फ़ॉर्म है जो उपयोगकर्ता को मेरे ऐप को कॉन्फ़िगर करने की अनुमति देता है।प्रोग्राम रन के बीच फ़ॉर्म और नियंत्रण को कैसे सहेजना/पुनर्स्थापित करना है?

प्रोग्राम चालू होने पर फॉर्म स्थिति & पुनः लोड करने का सबसे अच्छा तरीका क्या है।

मैं पाठ वह सूची बॉक्स, कॉम्बो/सूची/रेडियो के चयनित आइटम में प्रवेश किया है, चाहे एक चेकबॉक्स चीक्ड है, इसका मतलब आदि

+3

मुझे लगता है कि आप WinForms का उपयोग कर रहे हैं, लेकिन मुझे अनुमान लगाने की आवश्यकता नहीं है। साथ ही, कृपया अपने शीर्षक में टैग डुप्लिकेट न करें। –

+2

+1 क्योंकि आप मेरी मदद करने की कोशिश कर रहे हैं। हां WinForms। खेद है कि आपको अनुमान लगाना था, अब मैं सिर्फ 5 घंटे से अधिक समय तक वीबी का उपयोग कर रहा हूं - कुल समय बीत चुका है - कुछ चीजें अभी भी मेरे लिए नई हैं ;-)। – Mawg

+1

@mawg, क्या आप विस्तृत कर सकते हैं - मैंने आपके प्रश्न को * * के रूप में पढ़ा है, "मेरे पास एक फॉर्म है जिसमें विभिन्न कॉन्फ़िगरेशन सेटिंग्स हैं जिन्हें मैं हर बार फॉर्म खोले जाने पर सही मूल्य पर पूर्व-पॉप्युलेट करना चाहता हूं" *। या आप पूछ रहे हैं * "मैं अगली बार किसी भी विशेष रूप की वर्तमान स्थिति को कैसे सहेज सकता हूं" *? क्या आप एप्लिकेशन कॉन्फ़िगरेशन, या बस कुछ सत्र प्रकार की चीज़ें सहेजना चाहते हैं? ऐसा लगता है कि अन्य उत्तरदाताओं ने आपके प्रश्न को अलग-अलग पढ़ा है जो मैंने किया था। – slugster

उत्तर

3

बहुत से लोग यहाँ मुझे बता जब बचाने के लिए, लेकिन कई नहीं मुझे बता कैसे ...

अंत मैं WritePrivateProfileString() के साथ चला गया में

0
Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    ' save all the values you want' 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    If SaveSettingsExist Then 
     ' restore all the values you want' 
    End If 

End Sub 
+0

आह (स्पष्टीकरण के लिए पूछने के लिए +1) अगली बार के लिए बचाने के लिए करते हैं, मैन्युअल :-(मैं फिर से एक फाइल करने के लिए प्रपत्र स्ट्रीमिंग की तरह कुछ के लिए उम्मीद और वापस। इस तरह से मैं कोड और इसे दो बार करता है, तो बदल लिखने के लिए है किसी भी नियंत्रण को जोड़ा गया है, हटाया गया है या – Mawg

1

आप जहां प्रवेश किया सेटिंग सहेजने के लिए की कुछ ही विकल्प हैं - एक विन्यास फाइल में, या रजिस्ट्री में, शायद एक डेटाबेस (शायद "क्लाउड" भी हो, लेकिन मैं वहां नहीं जाऊंगा)।

आप उपयोगकर्ता इससे पहले कि आप सेटिंग्स को सहेजने के (जैसे कि एक लागू करें बटन पर क्लिक के रूप में) एक विशिष्ट कार्रवाई बाहर ले जाने होना चाहिए - के रूप में है कि अंततः नहीं है, जब उपयोगकर्ता प्रपत्र बंद कर देता है आप न सिर्फ सेटिंग्स सहेजने चाहिए अच्छा यूएक्स

आप कैसे बने रहें पूरी तरह से आप पर निर्भर हैं - आप उन्हें सीधे नाम/मूल्य जोड़ी शैली कॉन्फ़िगर फ़ाइल में सहेज सकते हैं, आप कॉन्फ़िगरेशन फ़ाइल में XML का उपयोग करना चाह सकते हैं, या आप उन्हें कुंजी और मान के रूप में सहेज सकते हैं रजिस्ट्री में एक ज्ञात स्थान (या आप नाम/मान जोड़े को डेटाबेस तालिका में सहेज सकते हैं)।

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

संपादित करें: किसी अन्य उत्तर पर अपनी टिप्पणी पढ़ने के बाद, यहां एक और विकल्प है, थोड़ा और उन्नत है। पहले से उल्लिखित सेटिंग्स वर्ग का उपयोग करें, लेकिन बाध्यकारी का भी उपयोग करें - आप सीधे अपनी फॉर्म पर अपनी सेटिंग्स ऑब्जेक्ट को बाध्य कर सकते हैं, इसलिए दर्ज किए गए किसी भी मान को सीधे कोड ऑब्जेक्ट में अपडेट किया जाएगा, बिना कोड के लिखने के लिए (यदि आप दो का उपयोग करते हैं रास्ता बाध्यकारी)। "स्ट्रीमिंग" को सेटिंग ऑब्जेक्ट को फ़ाइल (या डेटाबेस) में क्रमबद्ध करके हासिल किया जा सकता है, मेरा सुझाव है कि आप देखें।

0

मेरे पास वास्तव में कुछ सामान्य जेनेरिक दिनचर्या हैं जिनका उपयोग मैं फॉर्म आकार/स्थिति और सूची दृश्य कॉलम सेटिंग्स को सहेजने के लिए करता हूं। तो मैं कुछ की तरह है ...

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing 

    SaveFormPos(Me) 
    SaveListview(Me, lvuInvoices) 

End Sub 

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load 

    RestoreFormPos(Me) 
    RestoreListview(Me, lvuInvoices) 

End Sub 

(सूची दृश्य दिनचर्या के लिए) मेरे पैरामीटर के मानों रजिस्ट्री को बचाया जा करने के लिए एक कुंजी बनाने के लिए प्रयोग किया जाता है। आपके सामने आपके सभी प्रकार के विकल्प हैं। आप इस कार्यक्षमता को अपने सभी फॉर्मों के लिए बेस क्लास में रख सकते हैं, एक सेवस्टेट क्लास बना सकते हैं, या बस मॉड्यूल में दिनचर्या चिपक सकते हैं। आप इस डेटा को रजिस्ट्री, डेटाबेस, टेक्स्ट फाइलों में सहेज सकते हैं। आपके पास एक सामान्य दिनचर्या हो सकती है जो टेक्स्टबॉक्स, चेकबॉक्स आदि की तलाश में नियंत्रण संग्रह के माध्यम से हो सकती है।

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

0

मैं LoadSettings/SaveSettings फ़ंक्शन का सेट करने पर भी सहमत हूं जिसे फ़ॉर्म बनाते समय/फॉर्म को बंद करते समय कहा जाता है।

मैं Isolated Storage उपयोग करने की अनुशंसा एप्लिकेशन की सेटिंग के लिए एक दुकान स्थान के रूप में।

एक अतिरिक्त के रूप में, नियंत्रण आप अपने फार्म पर प्रयोग कर रहे हैं पर निर्भर करता है, तो आप XML स्वरूप प्रारूप में अपनी स्थिति को बचाने और फिर इसे अगली बार बहाल करने का विकल्प हो सकता था। उदाहरण के लिए Infragistics नियंत्रण इस संभावना प्रदान करते हैं (उदाहरण, UltraDockManager, UltraToolbarManager कार्यों के एक SaveAsXml/LoadFromXml जोड़ी है)।

1

फॉर्म को क्रमबद्ध करें।

लागू ISerializable, और serializable निर्माता और GetObject() विधि लोड में/अपने खेतों को बचाने के।

OnClosing में प्रपत्र को क्रमानुसार।

/// 
    /// try to obtain the las serialized main form with old data 
    MainForm mainForm = DeserializeMainForm("mainForm.data"); 
    /// 
    /// if any old data found, create a new(empty) main form 
    if (mainForm == null) mainForm = new MainForm(); 

    static MainForm DeserializeMainForm(string filePath) 
    { 
     MainForm mf = null; 
     FileStream fileStream = null; 
     try 
     { 
      BinaryFormatter binaryFormatter = new BinaryFormatter(); 
      fileStream = new FileStream(filePath, FileMode.Open); 
      mf = (MainForm)binaryFormatter.Deserialize(fileStream); 
     } 
     catch { } 
     finally 
     { 
      if (fileStream != null) 
      { 
       fileStream.Close(); 
      } 
     } 

     return mf; 
    } 

MainForm:

[Serializable] 
public partial class MainForm : Form, ISerializable 
{ 
     protected MainForm(SerializationInfo info, StreamingContext context) 
     : this() 
    { 
     if (info == null) 
      throw new System.ArgumentNullException("info"); 

     this.tbxServerIp.Text = info.GetString("server ip"); 
     this.tbxServerPort.Text = info.GetString("server port"); 
     this.tbxEventFilter.Text = info.GetString("event filter"); 
     this.tbxWallId.Text = info.GetString("wallId"); 

     foreach (Control control in this.Controls) 
     { 
      if (control is EventSender) 
      { 
       EventSender eventSender = (control as EventSender); 
       eventSender.LoadFromSerializationInfo(info); 
      } 
     } 
    } 

    private void SerializeThis() 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     FileStream fileStream = new FileStream("mainForm.data", FileMode.Create); 
     try 
     { 
      binaryFormatter.Serialize(fileStream, this); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
    } 

    protected override void OnClosing(CancelEventArgs e) 
    { 
     SerializeThis(); 
     base.OnClosing(e); 
    } 
} 
-1

आप छुपे हुए रूप में किसी छिपे हुए textbox में सबकुछ बचा सकते हैं। जब उपयोगकर्ता apply बटन पर क्लिक करता है, तो टेक्स्ट फ़ाइल को स्वचालित रूप से खोलें और प्रोग्राम को लाइन द्वारा लाइन को पढ़ें।

उदाहरण:

  • पंक्ति 1 एक छवि
  • पंक्ति 2 का स्थान हो सकता है एक पाठ बॉक्स
  • लाइन 3 एक शब्द या संख्या है कि कार्यक्रम निर्धारित करने के लिए उपयोग करता है हो सकता है के लिए पाठ हो सकता है यदि चेकबॉक्स सत्य या गलत
+0

बदल गया है आप बस समस्या को स्थानांतरित कर रहे हैं। ओपी को अब यह लिखना होगा कि इस पाठ से कैसे लिखना और पढ़ना है, और फ़ाइल से लिखना और पढ़ना है। –

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