2010-07-27 10 views
16

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

मुझे पहले भी यही समस्या थी, लेकिन उस स्थिति में मुझे सेल के पृष्ठभूमि रंग को उसी समय बदलना पड़ा जब मूल्य बदल गया। इसने सेल को सही ढंग से रीफ्रेश करने का कारण बना दिया।

एक ही रास्ता मैं यह काम करने के लिए है प्राप्त कर सकते हैं ...

dataGridView.DataSource = null; 
dataGridView.DataSource = myBindingList 

... लेकिन मैं वास्तव में इस से बचने के लिए के रूप में यह स्क्रॉलबार वापस ऊपर पॉप बनाता है, और इसका मतलब है कि चाहते हैं मुझे फिर से अपने सेल पृष्ठभूमि रंग सेट करना होगा। निश्चित रूप से एक बेहतर तरीका है। मैंने ताज़ा करने की कोशिश की है (साथ ही साथ माता-पिता को रीफ्रेश करना), अपडेट करें, और अमान्य करें, लेकिन वे जो भी कर रहे हैं वह नहीं कर रहे हैं।

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

उत्तर

20

ListChanged सूचनाएं केवल उठाए गए हैं सूची आइटम प्रकार INotifyPropertyChanged इंटरफ़ेस लागू करता है।

से लिया: http://msdn.microsoft.com/en-us/library/ms132742.aspx

तो मेरा पहला सवाल होगा: अपने मद INotifyPropertyChanged ठीक से लागू करता है?

+0

हाँ! इसने पूरी तरह से समस्या हल की। बहुत बहुत धन्यवाद! –

+0

इसके लिए धन्यवाद, बहुत सराहना की –

1

ऐसा लगता है जैसे आपकी चेंज ऑब्जेक्ट अधिसूचना सही ढंग से ट्रिगर/प्रबंधित नहीं होती है। डेटाग्रीड व्यू को बाध्य करते समय मैं व्यक्तिगत रूप से हमेशा बाध्यकारी स्रोत ऑब्जेक्ट का उपयोग करता हूं।

मैं DataGridView FAQ और DataBinding FAQ और ऑब्जेक्ट चेंज अधिसूचना की खोज करूंगा।

यदि आप ADO.Net का उपयोग कर रहे हैं, तो कॉल को भूलें। Validate() और .ndEdit() विधियां। आइटम मूल्य में परिवर्तन के लिए

0
private void refreshDataGrid() 
    { 
     dataGridView1.DataSource = typeof(List<>); 
     dataGridView1.DataSource = myBindingList; 
     dataGridView1.AutoResizeColumns(); 
     dataGridView1.Refresh(); 
    } 

फिर, बस के लिए refreshDataGrid विधि कभी भी एक बदलाव अपनी सूची में होता है कहते हैं।

3

यहाँ एक संग्रह करने के लिए एक DataGridView बंधन पर एक ट्यूटोरियल है - INotifyPropertyChanged

http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-collection

+0

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

3

बस myBindingList.ResetBindings() जब भी आपका डेटा परिवर्तन कहते हैं!

+0

हाँ ... काम नहीं करता है। –

4

बाइटिंगलिस्ट में किसी भी बदलाव के लिए डेटाग्रिडव्यू में प्रतिबिंबित होने के लिए आपके डेटासोर्स को INotifyPropertyChanged लागू करना चाहिए।

class Books : INotifyPropertyChanged 
{ 
    private int m_id; 
    private string m_author; 
    private string m_title; 

    public int ID { get { return m_id; } set { m_id = value; NotifyPropertyChanged("ID"); } } 
    public string Author { get { return m_author; } set { m_author = value; NotifyPropertyChanged("Author"); } } 
    public string Title { get { return m_title; } set { m_title = value; NotifyPropertyChanged("Title"); } } 


    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
    } 
} 

BindingList<Books> books= new BindingList<Books>(); 

datagridView.DataSource = books; 
+0

यह सही था। आपका बहुत बहुत धन्यवाद।एमएसडीएन को अपने कोड उदाहरण करने के लिए स्टैक ओवरव्लो के साथ अनुबंध करना चाहिए; माइक्रोसॉफ्ट के पास वांछित होने के लिए बहुत कुछ छोड़ दिया गया है ("यहां कोड की एक पंक्ति है जो वास्तव में आपकी मदद नहीं करती है ...") – curob

+0

प्रतिभा। इतना समय और कोड बचा रहा है। ज्ञात नहीं है 'PropertyChanged' Winforms में काम करेगा। आपका बहुत बहुत धन्यवाद! – C4u

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