2011-01-13 6 views
10

मैं एक DataGridView में एक Windows में लोगों की एक सूची प्रदर्शित करना चाहते हैं एप्लिकेशन फॉर्म्स। मैं चाहता हूं कि मेरी सेवा परत व्यक्ति वस्तुओं की सूची लौटाए (उदाहरण के लिए, IList<Person>)। मैं सूची में बदलाव DataGridView और इसके विपरीत में प्रतिबिंबित करना चाहता हूं। मैं समझता हूँ कि BindingSource का उपयोग कर DataGridView के साथ काम करने की सुविधा है। मेरा प्रश्न दो तरह से डेटा बाइंडिंग काम करने के लिए है, मैं क्या ज़रूरत है:क्या मुझे WinForms डेटा बाइंडिंग के लिए बाध्यकारी स्रोत और बाध्यकारी सूची चाहिए?

//pseudo code 
BindingSource.DataSource = IBindingList<Person> 

या मैं कर सकते हैं:

BindingSource.DataSource = IList<Person> 

क्या अंतर है? यदि सूची में मेरा परिवर्तन बदलता है तो DataGridView किसी भी तरह से अपडेट किया जाएगा? और मैं BindingList उपयोग करने के लिए है, यह एक छोटे से wonky मेरी सेवा परत से BindingList वापस जाने के लिए (क्योंकि निर्भरता बनाने के) लगता है, वहाँ है कि चारों ओर एक तरीका है?

माइक्रोसॉफ्ट (टिप्पणी अनुभाग में) BindingList का कहना है http://msdn.microsoft.com/en-us/library/ms132679.aspx:

"हालांकि, ठेठ समाधान प्रोग्रामर एक वर्ग है कि इस तरह के BindingSource के रूप में डेटा बाइंडिंग कार्यक्षमता, प्रदान करता है, के बजाय का उपयोग करेगा सीधे BindingList<T> का उपयोग कर। "

उत्तर

3

आप BindingList<T> का उपयोग करते हैं तो बदल जाता है कि आप डेटा के लिए बाध्य नियंत्रण में परिलक्षित होगा जब सूची बदल गया है क्योंकि BindingList एक घटना को जन्म देती है अंतर्निहित सूची के माध्यम से करते हैं। अधिकांश अन्य संग्रह नहीं करते हैं।

यदि आप डेटा स्रोत के रूप में सामान्य संग्रह का उपयोग करते हैं तो आप अन्य डेटा बाध्य नियंत्रण (या बाध्यकारी स्रोत के माध्यम से) के माध्यम से किए गए परिवर्तनों को अभी भी प्रतिबिंबित करेंगे, लेकिन अंतर्निहित संग्रह में परिवर्तन सीधे नहीं होंगे।

+0

मेरे भ्रम का एक हिस्सा यह था कि कुछ लोगों ने सुझाव दिया था कि जब तक आप बाइंडिंग स्रोत का उपयोग नहीं कर रहे थे तब तक आपको दो-तरफा डाटाबेसिंग प्राप्त करने के लिए बाध्यकारी सूची का उपयोग करने की आवश्यकता नहीं थी। लेकिन मुझे लगता है कि आप जो कह रहे हैं वह केवल तभी सच है जब आप केवल बाइंडिंग स्रोत के माध्यम से सूची को संशोधित करते हैं। – User

10

एक IList<Person> लिए बाइंडिंग केवल आप एक तरह से बाध्यकारी देगा; सूची या सूची आइटम में परिवर्तन DataGridView में दिखाई नहीं देंगे। आप एक BindingList या BindingSource बजाय इस कार्यक्षमता प्राप्त करने के लिए उपयोग कर सकते हैं, लेकिन अपने Person वर्ग अभी भी INotifyPropertyChanged का समर्थन करने की आवश्यकता होगी वरना आप केवल तुल्यकालन मिल जाएगा जब आइटम शामिल किए/to/निकाल दिए जाते हैं सूची से, जब सूची में खुद को आइटम परिवर्तन नहीं।

यदि आप System.Windows.Forms पर निर्भरता से बचना चाहते हैं, तो आप इसके बजाय ObservableCollection<Person> का उपयोग कर सकते हैं; यह आवश्यक परिवर्तन अधिसूचनाओं का समर्थन करता है और इसलिए इसे दो-तरफा बाध्यकारी स्रोत के रूप में उपयोग किया जा सकता है।

+6

जब तक वह .NET 4 का उपयोग नहीं कर रहा है, अवलोकन करने योग्य कोलेक्शन में एक और अधिक बोझिल निर्भरता है क्योंकि इसे एक WPF असेंबली (विंडोजबेस) में परिभाषित किया गया है। यह केवल .NET 4 में System.dll में स्थानांतरित हो गया था। – Josh

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