2012-12-21 16 views
12

मैं कन्स्ट्रक्टर के माध्यम से ग्राहकों की एक सूची पास कर रहा हूं। फिर यह एक सूची बॉक्स के लिए डेटाबेस है। मैंने ग्राहक के नाम को बदलने की अनुमति देने के लिए टेक्स्टबॉक्स को भी डाटाबेस किया है, यह स्वचालित रूप से सूची बॉक्स और ग्राहक सूची अपडेट करता है, जो वास्तव में अच्छा है।डाटाबेसिंग के माध्यम से किए गए परिवर्तनों को कैसे रद्द करें?

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

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Collections.Generic; 

namespace Bingding_Test 
{ 
    public partial class Form_Customers : Form 
    { 
     List<Customer> customers; 
     List<Customer> old_customers; 
     BindingSource bs = new BindingSource(); 

     public Form_Actors(List<Customer> _customers) 
     { 
      InitializeComponent(); 

      customers = _customers; 
      old_customers = new List<Customer>(_customers); 

      bs.DataSource = customers; 
      listBox1.DataSource = bs; 
      listBox1.DisplayMember = "Name"; 

      txtb_name.DataBindings.Add("Text", bs, "Name"); 
     } 

     void Btn_cancelClick(object sender, EventArgs e) 
     { 
      actors = old_customers; 
      this.Close(); 
     } 

     void Btn_saveClick(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 

किसी को भी पता है कि मुझे यकीन है कि सभी परिवर्तनों को सहेजा नहीं कर रहे हैं बनाने के लिए क्या कर सकते हैं जब मैं रद्द बटन पर क्लिक करें?

उत्तर

5

जहां तक ​​मुझे समझा गया, आपका प्रश्न List<Customer> से txtb_name में किए गए परिवर्तनों को रद्द करने के लिए संभव बनाने के बारे में है। डिफ़ॉल्ट रूप से, DataBindings सत्यापन पूर्ण होने पर स्वचालित रूप से परिवर्तन लागू होता है। आप DataSourceUpdateMode नियंत्रित कर सकते हैं इस व्यवहार को बदलने के लिए, अलग अलग तरीकों से अपने क्रियान्वयन पर निर्भर करता है:

  1. इससे पहले कि आप txtb_name पर कोई बाइंडिंग की स्थापना (कैसे अपने कोड लिखा है के साथ संभव हो जाना चाहिए):

    txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never; 
    
  2. आप (अपने कोड के साथ भी संभव) txtb_name पर बाइंडिंग सेट करने के बाद:

    foreach(Binding b in txtb_name.DataBindings) 
    { 
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never; 
    } 
    
  3. BindingManagerBase (CurrencyManager या PropertyManager) का उपयोग करके बाइंडिंग सेट करने के बाद - अधिक सामान्य दृष्टिकोण, क्योंकि यह आपको एक शॉट में कई नियंत्रणों को संभालने की अनुमति देता है, जब आपकी परियोजना विकसित होती है तो उपयोगी हो सकती है।

    foreach(Binding b in bindingManager.Bindings) 
    { 
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never; 
    } 
    

complex setups के लिए आप ResumeBinding और BindingManagerBase की SuspendBinding उपयोग कर सकते हैं, वे कस्टम व्यवहार, उदाहरण के लिए यदि एक से अधिक क्षेत्रों में एक पूरे तार्किक टुकड़ा के रूप में मान्य करने की जरूरत है एक मान्यता पर प्रदान करने के लिए, के बजाय ओवरराइड किया जा सकता एक - एक करके।

कृपया ध्यान दें, भले ही आप DataSourceUpdateMode = DataSourceUpdateMode.Never निर्धारित करते हैं, वहाँ हमेशा एक अद्यतन (टिप्पणी अनुभाग देखें), के माध्यम से according to MSDN आ रहा होगा कि:

यहां तक ​​कि जब अद्यतन मोड कभी नहीं, डेटा स्रोत हो जाएगा करने के लिए सेट कर दिया जाता बाध्यकारी पहली बार बनाया गया है, तो कम से कम एक अद्यतन हमेशा होता है।

यदि यह आपके लिए स्वीकार्य नहीं है, यानी आप, बहुत सख्त आवश्यकताओं के साथ उद्यम-वर्ग आवेदन का निर्माण कर रहे मैं सब कुछ मैन्युअल रूप से निपटने के सुझाव देते हैं - DataBindings का उपयोग बंद।

DataSourceUpdateMode पर संकेत के लिए क्रेडिट WinForms: DataBinding on a cancellable Dialog Form पर उनके लेख के लिए फ्रेडरिक गेहेल्स के पास जाता है।

+0

जब आप मैन्युअल रूप से बाध्य कहते हैं, तो क्या आपका मतलब डाटाबेसिंग का उपयोग नहीं करना है? उदाहरण के लिए -> textBox1.Text = variable.strName। – TheScholar

+0

@TheScholar: ऐसा लगता है कि मैं गलत था, यानी आप डेटा बाइंडिंग के साथ रद्दीकरण को कार्यान्वित कर सकते हैं - मेरा संपादन देखें। – Neolisk

+0

धन्यवाद Neolisk! मैं इसका विश्लेषण करूंगा और देख सकता हूं कि यह मेरी समस्या हल करता है: डी – TheScholar

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

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