2008-08-02 20 views
43

डेटा मान लें आप तो अब हम है कि सरणी के लिए बाध्य 2 कॉम्बो बक्से हैं निम्नलिखितWinForms ComboBox बाध्यकारी पकड़ लिया

List<string> myitems = new List<string> 
{ 
    "Item 1", 
    "Item 2", 
    "Item 3" 
}; 

ComboBox box = new ComboBox(); 
box.DataSource = myitems; 

ComboBox box2 = new ComboBox(); 
box2.DataSource = myitems 

की तरह कुछ कर रहे हैं, और सब कुछ ठीक काम करता है। लेकिन जब आप एक कॉम्बो बॉक्स के मान को बदलते हैं, तो यह आपके द्वारा चुने गए दोनों को कॉम्बो बॉक्स बदल देता है।

अब, मुझे पता है कि Arrays हमेशा संदर्भ द्वारा पारित होते हैं (सीखा है कि जब मैंने सी: डी सीखा), लेकिन क्यों कॉम्बो बॉक्स एक साथ बदलेंगे? मुझे विश्वास नहीं है कि कॉम्बो बॉक्स नियंत्रण संग्रह को संशोधित कर रहा है।

के चारों ओर एक काम के रूप में, इस funcionality कि उम्मीद है/प्राप्त होता नहीं है वांछित

ComboBox box = new ComboBox(); 
box.DataSource = myitems.ToArray(); 

उत्तर

36

यह कैसे डेटा बाइंडिंग, डॉटनैट ढांचे में स्थापित कर रहे हैं विशेष रूप से BindingContext से कोई लेना देना नहीं है। उच्च स्तर पर इसका अर्थ यह है कि यदि आपने अन्यथा प्रत्येक फॉर्म निर्दिष्ट नहीं किया है और फॉर्म के सभी नियंत्रण समान BindingContext साझा करते हैं। जब आप DataSource प्रॉपर्टी सेट कर रहे हैं तो ComboBoxBindingContext का उपयोग ConcurrenyMangager प्राप्त करने के लिए करेगा जो सूची को लपेटता है। ConcurrenyManager सूची में वर्तमान चयनित स्थिति के रूप में ऐसी चीजों का ट्रैक रखता है।

आप दूसरी ComboBox यह एक ही BindingContext (रूपों) का उपयोग करेगा जो एक ही ConcurrencyManager के रूप में ऊपर डेटा बाइंडिंग स्थापित करने के लिए प्रयोग किया जाता है के लिए एक संदर्भ निकलेगा की DataSource सेट करते हैं।

अधिक विस्तृत स्पष्टीकरण प्राप्त करने के लिए BindingContext देखें।

+1

कोई लाभ प्रदान करने के लिए बहुत सारे प्रयासों की तरह लगता है और डेटा बाध्यकारी नियंत्रण पूरी तरह से सहज ज्ञान युक्त काउंटर बनाते हैं। – Belmiris

19

एक बेहतर कामकाज (डेटासोर्स के आकार के आधार पर) दो BindingSource ऑब्जेक्ट्स (2.00 के रूप में नया) घोषित करना है और उनको संग्रह को बांधें और फिर उन्हें comboboxes से बांधें।

मैं एक पूर्ण उदाहरण संलग्न करता हूं।

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     private BindingSource source1 = new BindingSource(); 
     private BindingSource source2 = new BindingSource(); 

     public Form1() 
     { 
      InitializeComponent(); 
      Load += new EventHandler(Form1Load); 
     } 

     void Form1Load(object sender, EventArgs e) 
     { 
      List<string> myitems = new List<string> 
      { 
       "Item 1", 
       "Item 2", 
       "Item 3" 
      }; 

      ComboBox box = new ComboBox(); 
      box.Bounds = new Rectangle(10, 10, 100, 50); 
      source1.DataSource = myitems; 
      box.DataSource = source1; 

      ComboBox box2 = new ComboBox(); 
      box2.Bounds = new Rectangle(10, 80, 100, 50); 
      source2.DataSource = myitems; 
      box2.DataSource = source2; 

      Controls.Add(box); 
      Controls.Add(box2); 
     } 
    } 
} 

यदि आप स्वयं को और भी भ्रमित करना चाहते हैं तो हमेशा निर्माता में बाइंडिंग घोषित करने का प्रयास करें। इसके परिणामस्वरूप वास्तव में उत्सुक बग्स हो सकता है, इसलिए मैं हमेशा लोड ईवेंट में बाध्य करता हूं।

+1

यह इंगित करने के लिए धन्यवाद कि निर्माता वास्तव में कुछ वास्तव में जिज्ञासु बग में बाध्यकारी परिणाम। मुझे एक ही समस्या थी और मैंने अपना कोड लोड इवेंट में ले जाया और यह बाध्य डेटा दिखाया। – bunggo

+0

मुझे इसके साथ कुछ अजीब अप्रतिबंधित बग मिल गई हैं। सबसे खराब स्थिति यह है कि एक combobox किसी भी अन्य नियंत्रण पर वापस अपना ध्यान देने से इंकार कर दिया: डी – Quibblesome

1

यह सिर्फ एक टाइपो हो सकता है, लेकिन कोड में आपके द्वारा दी गई आप केवल पहले कॉम्बो बॉक्स संदर्भ जब डेटा स्रोत की स्थापना:

ComboBox box = new ComboBox(); 
box.DataSource = myitems; 

ComboBox box2 = new ComboBox(); 
**box**.DataSource = myitems 

box2 के लिए डेटा स्रोत सेट नहीं है।

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