2009-03-23 4 views
9

के साथ अजीब समस्या मैं एक विंडोज़ एप्लिकेशन लिख रहा हूं और एक सूची बॉक्स नियंत्रण का उपयोग कर रहा हूं। मैं विजुअल स्टूडियो सी # 2008 एक्सप्रेस संस्करण के साथ विकास कर रहा हूं।ListBox.DataSource

मैं एक डेटा उद्देश्य यह है कि इस

public class RootObject 
{ 
    public List<SubObject> MySubObjects{ get; set;} 
} 

मैं अपने फार्म पर एक ListBox, और यह भी एक संपत्ति "MyRootObject" जो, जाहिर है, एक RootObject रखती है मिल गया है की तरह कुछ लग रहा है मिल गया है। जब नियंत्रण आरंभ नहीं हो जाता, मैं सेट:

_listBox.DataSource = MyRootObject.MySubObjects; 

अब, जब प्रपत्र लोड हो जाए, मैं डिबग और देखो डेटास्रोत ठीक से सेट किया जा रहा है कि। लेकिन कुछ भी प्रदर्शित नहीं होता है। मैंने SubObject की ToString() विधि को ओवरराइड कर दिया है और इसे भी बुलाया नहीं जा रहा है। मैंने _listBox.DisplayMember को SubObject की एक संपत्ति पर सेट करने का प्रयास किया ताकि यह देखने के लिए कि वहां कुछ समस्या है या नहीं, लेकिन अभी भी कुछ भी नहीं है। मैंने डेटासोर्स सेट करने के बाद _listBox.Update() और _listBox.Refresh() को कॉल करने का प्रयास किया, लेकिन फिर भी कोई प्यार नहीं। डेटासोर्स में सभी डेटा है ... यह सिर्फ इसे प्रदर्शित करने से इनकार कर रहा है।

इसलिए जब डीबगिंग, मैं WTF सोचा और मैं सिर्फ पर्याप्त

_listBox.DataSource = new List<SubObject>{ new SubObject(), new SubObject() }; 

ज़रूर करना का फैसला किया, यह काम किया, और मैं अपने लिस्टबॉक्स में सूचीबद्ध दो चीजें देखते हैं।

तो फिर, वास्तव में उत्सुक है, मैं वस्तुओं की सूची को कॉपी करने और लिस्टबॉक्स में है कि डाल, तो तरह की कोशिश करने का फैसला किया:

_listBox.DataSource = MyRootObject.MySubObjects.ToArray(); 

यह काम करता है! और यह अब मेरी समस्या के लिए एक कामकाज है ... लेकिन एक बहुत परेशान है। क्या किसी को पता है कि मुझे मूल रूप से _listBox.DataSource = MyRootObject.MySubObjects को सेट करने के बजाय, इसे काम करने के लिए इस तरह की वस्तुओं की सूची की प्रतिलिपि बनाने की आवश्यकता क्यों है; ? दोबारा, डाटासोर्स के पास इसे सही करने के बाद सभी सही डेटा हैं ... यह तब होता है जब यह डेटा कॉपी करता है, यह वास्तव में प्रदर्शित होता है, और जब ऐसा नहीं होता है, तो यह प्रदर्शित नहीं होता है।

उत्तर

1

मेरे सिर के ऊपर से, ऐसा इसलिए है क्योंकि ListBox.DataSource संपत्ति में कुछ ऐसा होना चाहिए जो IList इंटरफ़ेस लागू करता हो। आपका सामान्य List<SubObject>IList लागू नहीं करता है; यह IList<T> लागू करता है (System.Collections.Generic नामस्थान में)। Array ऑब्जेक्ट्स दूसरी तरफ IList से प्राप्त होते हैं, इसलिए उस प्रकार के ऑब्जेक्ट कार्यों के माध्यम से डेटा को सौंपना।

आप एक Enumerator अपने List<SubObject> वस्तु से बाहर (जो भी IList लागू करता है) खींच कोशिश करते हैं और प्लग कि में कर सकता है। अगर यह काम करता है, तो इस मुद्दे को मैं का वर्णन किया है आपकी समस्या है। अगर ऐसा नहीं होता है, तो मैं अपनी टोपी से बात कर रहा हूं।

यदि यह वास्तव में मुद्दा है, तो मुझे आश्चर्य है कि असमर्थित वस्तु में घूमने से अपवाद नहीं निकलता है।

+0

मैं इस एक ही समस्या है, और यह पेज कि सूची IList के साथ-साथ IList को लागू करता है कहते हैं: https://social.msdn.microsoft.com/Forums/vstudio/en- यूएस/a58e4f37-4abd-4eff-820e-33d09a7a432d/net-classes-that-apply-ilist? Forum = netfxbcl –

0

मैं तुम्हें सूची बॉक्स डेटा स्रोत पर कुछ _listBox.DataSource.bind (जैसे बताए के बाद बाइंड विधि कॉल करने के) है लगता है और आप अपने लिस्टबॉक्स गायब हो गया

0

आप कोशिश करते हैं और इस्तेमाल कर सकते हैं एक BindingSource होगा (http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx)

सूचीबॉक्स और आपके संग्रह के बीच में।Bindingsources सामान का एक गुच्छा संभालती है और यह भी निलंबित करें/ResumeBinding properies जब सूची

आप भी WPF के रूप में अपनी डेटा बाइंडिंग दूर WinForms की है कि बेहतर है बाहर की कोशिश कर सकते अद्यतन करने कि उपयोगी हो सकता है शामिल हैं :) लेकिन शायद संभव नहीं में thats अपने केस

0

मुझे विश्वास है कि आपको _listbox.DataBind() पर कॉल करने की आवश्यकता है; डेटासोर्स असाइन करने के बाद। हालांकि, मैंने पहले कभी डेटासेट के रूप में प्रॉपर्टी का उपयोग नहीं किया है, मैंने केवल विधियों का उपयोग किया है। क्या आपने यह देखने के लिए अपनी संपत्ति को बदलने की कोशिश की है कि क्या यह समस्या है?

+2

मैं गलत हो सकता हूं लेकिन मेरा मानना ​​है कि यह केवल एएसपी.NET में लागू है। मुझे लगता है कि ओपी शायद Winforms का उपयोग कर रहा है। –

+0

मुझे खेद है, मैंने यह नहीं देखा। शायद तुम सही हो। स्पष्टीकरण के लिए धन्यवाद। :-) –

1

अब तक कि मुझे पता है, तो आप एक

[ComboBox,ListBox].DataSource 

करने के लिए एक संग्रह सेट करना चाहते हैं जब भी आप DisplayMember और ValueMember सेट करना होगा। DisplayMember और ValueMember संग्रह में क्लास के प्रॉपर्टी नाम से भरा हुआ है जो सूची बॉक्स/कम्बोबॉक्स को सौंपा गया है। पूर्व।

//Populate the data 
RootObject root = new RootObject(); 
root.MySubObjects.Add(new SubObject("1", "data 1")); 
root.MySubObjects.Add(new SubObject("2", "data 2")); 

//Assign data to the data source 
_listBox.DisplayMember = "DisplayProperty"; 
_listBox.ValueMember = "ValueProperty"; 
_listBox.DataSource = root.MySubObjects; 

root.MySubObjects subobject की सूची देता है, और subobject गुण DisplayProperty और ValueProperty, पूर्व नाम का है।

public class RootObject 
{ 
    public List<SubObject> MySubObjects { get; set; } 
} 

public class SubObject 
{ 
    public string ValueProperty { get; set; } 
    public string DisplayProperty { get; set; } 
} 
+1

डिस्प्लेमेन और वैल्यूमेम्बर सेट करना सामान्य है, लेकिन वैकल्पिक है; यदि आप DisplayMember को कॉन्फ़िगर नहीं करते हैं, तो ऑब्जेक्ट पर नियंत्रण ToString() को कॉल करता है; और यदि आप ValueMember सेट नहीं करते हैं, तो नियंत्रण मूल्य के लिए संपूर्ण ऑब्जेक्ट देता है। – Bevan

0

आप

_listBox.DataSource = new BindingList<SubObject> (MyRootObject.MySubObjects); 

बजाय की कोशिश कर सकते। बाइंडिंगलिस्ट सूची से कुछ और इंटरफेस लागू करता है, जो डेटा बाइंडिंग के लिए आवश्यक हैं।

0

मेरे पास इस तरह की समस्याओं के लिए एक विशेष नियम है कि मैं हमेशा पूरे दिन बर्बाद करने से पहले याद रखने की कोशिश करता हूं (मेरा विश्वास करो, मैंने कई दिनों तक हथियार बिताया है!)। नियम यह है: जब सिस्टम व्यवहार वास्तव में अजीब है, अंतर्निहित कारण बहुत बेवकूफ होना चाहिए। बुद्धिमान प्रोग्रामर के रूप में, हमारी समस्याओं को समझाने के लिए हमारे पास फ्रेमवर्क कोड में गूढ़ कारणों या बग की खोज करने की प्रवृत्ति है। कभी-कभी जवाब यह है कि हम जल्दी में थे और एक लापरवाह गलती की जिसे हमने अभी तक पकड़ा नहीं है।

शेरलॉक होम्स को उद्धृत करने के लिए, "जब आपने असंभव को हटा दिया है, तो जो कुछ भी रहता है, कोई फर्क नहीं पड़ता कि कितना असंभव है, सत्य होना चाहिए"। इस मामले में, असंभव सत्य यह है कि MyRoot ऑब्जेक्ट की MySubObjects प्रॉपर्टी शून्य है।

5
((CurrencyManager)_listBox.BindingContext[_listBox.DataSource]).Refresh(); 

Sux0r मुझे पता है, लेकिन यह काम करता है। (मूल रूप से पाया जवाब here)