2010-05-19 14 views
8

साथ मैं गतिशील इस तरह एक combobox बनाने हूँ:सी # सेट कॉम्बो आइटम selectedValue

public Control GenerateList(Question question) 
{ 
    // Get a list with answer possibilities 
    List<QuestionAnswer> answers = question.GetAnswers(); 

    // Get a collection of given answers 
    Collection<QuestionnaireAnswer> givenAnswers = question.GetFilledAnswers(); 

    ComboBox cmb = new ComboBox(); 
    cmb.Name = "cmb"; 
    cmb.DataSource = answers; 
    cmb.DisplayMember = "Answer"; 
    cmb.ValueMember = "Id"; 

    // Check an answer is given to the question 
    if (givenAnswers != null && givenAnswers.Count > 0) 
    { 
     cmb.SelectedValue = givenAnswers[0].AnswerId; 

    } 

    cmb.DropDownStyle = ComboBoxStyle.DropDownList; 
    cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged); 
    cmb.Leave += new EventHandler(cmb_Leave); 

    return cmb; 
} 

समस्या यह है, जब क्रियान्वित cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue हमेशा रिक्त है।

जब डीबगिंग और मैं answers (डेटासोर्स) का पता लगाता हूं तो मुझे लगता है कि आईडी (ValueMember) उत्तर आईडी (अगर कथन में) जैसा सटीक है। दोनों के पास एक ही प्रकार (लंबा) और एक ही मान है, लेकिन चयनित वैल्यू शून्य रहता है।

क्या ऐसा कुछ है जो मुझे नहीं दिखाई देता है?

संपादित करें:

ऐसा लगता है कि बता गया खाली रहता है की तरह। जब मैं cmb.SelectedValue = givenAnswers[0].AnswerId; को cmb.SelectedIndex = 0; के साथ प्रतिस्थापित करता हूं तो मुझे एक ArgumentOutOfRangeException मिलता है। यह जबकि उत्तर संग्रह गिनती 2 है। तो डेटास्रोत शून्य नहीं है ... बहुत स्ट्रेज हुह?

समाधान:

SelectedValue, SelectedIndex, SelectedItem गुण जब तक नियंत्रण रूप में जोड़ा जाता सेट नहीं किया जा सकता है। नियंत्रण में नियंत्रण जोड़ने के बाद, चयनित वैल्यू, -इंडेक्स और -इटम गुण सेट किए जा सकते हैं।

उत्तर

6

समाधान:

SelectedValue, SelectedIndex, SelectedItem गुण जब तक नियंत्रण रूप में जोड़ा जाता सेट नहीं किया जा सकता है। नियंत्रण में नियंत्रण जोड़ने के बाद, चयनित वैल्यू, -इंडेक्स और -इटम गुण सेट किए जा सकते हैं।

0

सुनिश्चित करें कि QuestionAnswer में आपके द्वारा उपयोग किए जाने वाले प्रदर्शन/मूल्य सदस्यों के लिए सार्वजनिक एक्सेसर्स संबंधित (समान नाम) हैं।

+0

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

3

मैंने पहले इस अजीब मुद्दा मिले थे, पिछले पर मैं एक और तरीका छोड़ दिया और प्रयोग किया है:

cmb.Items.FindByValue(givenAnswers[0].AnswerId).Selected = true; 

यह ठीक काम किया ... आप अच्छी किस्मत आशा है!

+0

मेरे पास FindByValue विधि नहीं है। शायद ऐसा इसलिए है क्योंकि मैं Winforms का उपयोग कर रहा हूँ? – Martijn

+0

WinForm कॉम्बो में वेब नियंत्रण के FindByValue जैसे एक विधि भी होनी चाहिए (शायद एक अलग नाम)। कोशिश करो। –

+0

मैंने इसे अलग करने के लिए एक अलग उत्तर जोड़ा है - DisplayMember पर FindString या FindStringExact का उपयोग करने का प्रयास करें। – Billious

1

क्या आप एक ही संपत्ति को देख रहे हैं?

cmb.ValueMember = "Id"; 
.. 
cmb.SelectedValue = givenAnswers[0].AnswerId; 

आप किसी अन्य ValueMember पर प्रतिक्रिया कर रहे हैं तो आईडी जिसे आप चयनित वैल्यू में पोस्ट कर रहे हैं। इसके अलावा आप डाटाबेसिंग से पहले अपना प्रदर्शन- और वैल्यू-सदस्य सेट करने का प्रयास करना चाहेंगे। यह तेज है।

+0

डेटास्रोत में एक अलग वर्ग है। दिए गए Answers में एक और वर्ग है, लेकिन AnswerId और आईडी का मान समान है। – Martijn

+0

वही प्रकार या समान मूल्य? – riffnl

0

मैं एक ही समस्या में भाग गया, और पाया कि मेरा मुद्दा था कि मैं चयनित वैल्यू को एक पूर्णांक के रूप में देख रहा था, जब वास्तव में यह एक वस्तु थी। डैनी चेन से "FindByValue" समाधान ऊपर WinForms में काम नहीं करता, तो मैं "FindStringExact" उपयोग करने की कोशिश और DisplayMember पर खोज की:

cmb.Items.FindStringExact(<Display string>) 

नहीं एक आदर्श समाधान है, लेकिन यह काम किया।

3
cmb.SelectedIndex = cmb.FindStringExact("Desired Value") 

cmb.FindStringExact ("वांछित स्ट्रिंग") मूल्य के सूचकांक आप चयन करना चाहते हैं वापस आती है और cmb.SelectedIndex कि सूचकांक को बता गया तय करता है।

मुझे प्रकाश दिखाने के लिए बिलियस के लिए धन्यवाद!

एफवाईआई - यह वीबीएनईटी विनफॉर्म संस्करण है।

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