2009-03-30 13 views
5

इन दो वर्गों की कल्पना कीजिए:ड्रापडाउन WinForms में बाध्यकारी

class Part 
{ 
public string Name { get; set;} 
public int Id { get; set; } 
} 

class MainClass 
{ 
public Part APart { get; set;} 
} 

मैं कैसे एक WinForm पर एक कॉम्बो बॉक्स को MainClass बाध्य कर सकते हैं, तो यह Part.Name प्रदर्शित करता है (DisplayMember = "Name";) और कॉम्बो के चयनित आइटम सेट ड्रॉपडाउन पर किसी भी घटना को संभालने की आवश्यकता के बिना मेनक्लास की एपर्ट संपत्ति।

जहां तक ​​मुझे पता है, कॉम्बोबॉक्स के ValueMember को "आईडी" में सेट करने का अर्थ है कि यह एपर्ट को एक नंबर (आईडी) पर सेट करने का प्रयास करेगा जो सही नहीं है।

आशा है कि यह पर्याप्त स्पष्ट है!

+0

अच्छा सवाल। मैंने वस्तुओं द्वारा कभी भी आईडी द्वारा चीजें नहीं की हैं। – Tony

+0

क्या कोई व्यक्ति "सार्वजनिक" में कोड में "संपत्ति" बदल सकता है? – Sung

उत्तर

1

क्या आप खोज रहे हैं ValueMember (= ComboBox.SelectedItem) ऑब्जेक्ट का संदर्भ हो, जबकि DisplayMember आइटम की एक ही संपत्ति है, सही? जहां तक ​​मुझे पता है, और DisplayMember कार्य के तरीके के कारण स्वयं को ComboBox बनाने और स्वयं को बाध्यकारी किए बिना ऐसा करने का कोई अच्छा तरीका नहीं है।

लेकिन, यहां कुछ चीज़ें है कि आप कोशिश (यह मानते हुए आप कहीं Part रों का एक संग्रह है) कर सकते हैं:

  1. अवहेलना `toString()` `Part` की विधि वापस जाने के लिए` नाम संपत्ति फिर अपने 'कॉम्बोबॉक्स' के `ValueMember` को" एपर्ट "पर सेट करें और` DisplayMember` शून्य छोड़ दें। (अनचाहे, इसलिए कोई गारंटी नहीं)
  2. आप स्वयं में एक संदर्भ वापस करने के लिए भाग में एक नई संपत्ति बना सकते हैं। 'ValueMember' को नई संपत्ति और 'DisplayMember' पर 'नाम' 'पर सेट करें। यह एक हैक की तरह महसूस कर सकता है, लेकिन यह काम करना चाहिए।
  3. अपने 'एपर्ट` गेटर और सेटर के साथ मजेदार चीजें करें। आप कुछ मजबूत टाइपिंग खो देंगे, लेकिन यदि आप 'एपर्ट' ऑब्जेक्ट बनाते हैं और 'मेन क्लास' में 'पार्ट' का संग्रह होता है, तो आप इसे 'आईडी` (`int`) या' Part` द्वारा सेट कर सकते हैं। (जाहिर है आप आईडी द्वारा स्थापित किए जाने की जब आप इसे करने के लिए ComboBox बाँध चाहता हूँ।)
Part _APart; 
object APart 
{ 
    get {return _APart;} 
    set { 
     if(value is int) 
      _APart = MyPartCollection.Where(p=>p.Id==value).Single(); 
     else if(value is Part) 
      _APart = value; 
     else 
      throw new ArgumentException("Invalid type for APart"); 
    } 
} 
0

मैंने थोड़ा सा शोध किया और this article पाया जहां लेखक मानक बाध्यकारी स्रोत घटक को विस्तारित करके नेस्टेड गुणों से जुड़ने में सक्षम हैं।
मैंने कोशिश की है और ऐसा लगता है कि यह ठीक काम करता है।

0

आप कॉम्बो बॉक्स शून्य पर की ValueMember सेट करते हैं, डेटा बाइंडिंग चयनित आइटम वापस आ जाएगी (अर्थात् भाग उदाहरण) विशिष्ट सदस्य के बजाय। DisplayMember को 'नाम' पर सेट करें।

+0

क्या आप इस के एक काम कर रहे स्निपेट प्रदान कर सकते हैं? मैं इसे वैल्यूमेम्बर को शून्य से सेट करने के साथ जो करता हूं उसे करने के लिए नहीं कर सकता। – Khash

0

"जानकारी" रखने के लिए बैकिंग क्लास बनाएं, और सभी डेटा के लिए गुण बनाएं। तब पर System.ComponentModel.INotifyPropertyChanged लागू उस वर्ग, कुछ की तरह:

private String _SelectedPart = String.Empty; 

public String SelectedPart 
{ 
    get 
    { 
     return _SelectedPart; 
    } 
    set 
    {    
     if (_SelectedPart != value) 
     { 
     _SelectedPart = value; 

     // helper method for handing the INotifyPropertyChanged event 
     PropertyHasChanged(); 
     } 
    } 
} 

तो उस वर्ग के लिए एक "ObjectDataSource" बनाने (Shift-Alt-डी में VS2008 कि ​​लाएगा, जबकि एक रूप को देख), तो अपने कॉम्बोबॉक्स पर क्लिक करें और निम्न गुण सेट करें:

डेटासोर्स, जिसे आपने अभी बनाया है ऑब्जेक्टडेटा स्रोत "बाइंडिंगसोर्स" पर सेट किया गया है। डिस्प्लेमेम्बर, भागों की सूची की नाम संपत्ति पर सेट करें वैल्यूमम्बर, भागों की सूची के आईडी सदस्य को सेट करें डेटा बाइंडिंग्स। चयनित वैल्यू, जिसे आपने अभी बनाया है "बाध्यकारी स्रोत" पर चयनित पट्टी पर सेट करें।

मैं जानता हूँ कि ऊपर जटिल लगता है, और यह कुछ समय लग सकता सभी भागों मैं सिर्फ वर्णित (काश मैं एक ट्यूटोरियल या स्क्रीनशॉट दे सकता है) लगता है, लेकिन वास्तव में यह एक बार आप इसकी आदत हो करने के लिए बहुत तेजी से होता ।

इस तरह से, .NET में "डेटा-बाध्यकारी" माना जाता है और वहां कुछ अच्छे ट्यूटोरियल हैं जो आपकी अधिक जानकारी दे सकते हैं।

+0

डेटा-बाध्यकारी पर आपकी पोस्ट के लिए धन्यवाद। हालांकि, यह लुकअप ऑब्जेक्ट की आईडी के विपरीत लुकअप ऑब्जेक्ट को बाध्य करने के बारे में प्रश्न का उत्तर नहीं देता है। – Khash