سؤال

نفترض أن كنت تفعل شيئا مثل التالية

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

حتى الآن لدينا 2 مربعات التحرير والسرد لا بد أن مجموعة و كل شيء يعمل بشكل جيد.ولكن عند تغيير قيمة واحدة مربع التحرير والسرد يتغير كل مربعات التحرير والسرد إلى واحد التي قمت بتحديدها فقط.

الآن, وأنا أعلم أن المصفوفات هي دائما مرت الإشارة (تعلمت أنه عندما تعلمت C :D) لكن لماذا التحرير والسرد مربعات تغيير معا ؟ أنا لا أصدق عنصر تحكم مربع التحرير والسرد هو تعديل مجموعة على الإطلاق.

كحل, لا هذا من شأنه أن يحقق الوظيفة التي من المتوقع/المطلوب

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
هل كانت مفيدة؟

المحلول

هذا له علاقة مع هذه الارتباطات التي أقيمت في dotnet framework ، وخاصة BindingContext.على مستوى عال وهذا يعني أنه إذا لم يتم تحديد خلاف ذلك كل شكل و كل الضوابط من شكل حصة نفس BindingContext.عند وضع DataSource الملكية ComboBox سوف تستخدم BindingContext للحصول على ConcurrenyMangager أن يلتف القائمة.على ConcurrenyManager يتتبع مثل هذه الأمور الحالية الموضع المحدد في القائمة.

عند تعيين DataSource الثاني ComboBox فإنه سيتم استخدام نفس BindingContext (النماذج) التي سوف تسفر إشارة إلى نفس ConcurrencyManager كما سبق المستخدمة في إعداد البيانات الارتباطات.

للحصول على شرح أكثر تفصيلا انظر BindingContext.

نصائح أخرى

أفضل حل (اعتمادا على حجم البيانات) هو أن تعلن اثنين 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);
        }
    }
}

إذا كنت تريد أن تخلط بين نفسك أكثر ثم حاول دائما معلنا الارتباطات في منشئ.هذا يمكن أن يؤدي في بعض حقا الغريب البق ، وبالتالي أنا دائما ربط في الحدث Load.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top