WinForms ComboBox привязки данных Гоча

голоса
44

Предположим, вы делаете что-то вроде следующего

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), но почему бы на земле комбо-боксы менять вместе? Я не считаю, что управление списком модифицирует коллекцию на всех.

В работе вокруг, не это было бы достичь funcionality, что, как ожидается, / желаемый

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Задан 02/08/2008 в 17:09
источник пользователем
На других языках...                            


3 ответов

голоса
37

Это связано с тем, как привязки данных создаются в рамках Dotnet, особенно BindingContext. На высоком уровне это означает , что если вы не указаны иным каждую форму и все элементы управление формой один и то же BindingContext. Когда вы устанавливаете DataSourceимущество, ComboBoxбудет использовать , BindingContextчтобы получить , ConcurrenyMangagerчто оборачивает список. ConcurrenyManagerОтслеживает такие вещи , как текущей выбранной позиции в списке.

Когда вы установите DataSourceвторого ComboBoxон будет использовать одни и те же BindingContext(формы) , которые дадут ссылку на тот же ConcurrencyManager, что и выше используется для настройки привязки данных.

Чтобы получить более подробное описание см BindingContext .

Ответил 02/08/2008 d 18:18
источник пользователем

голоса
20

Лучше обходной путь ( в зависимости от размера источника данных), чтобы объявить два BindingSourceобъекта (новые , как 2,00) связывают коллекцию с теми , и затем связывается с тем , выпадающими списками.

Я прилагаю полный пример.

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);
        }
    }
}

Если вы хотите , чтобы запутать себя даже больше , чем всегда пытаться объявить привязки в конструкторе. Это может привести к некоторым очень любопытным ошибкам, поэтому я всегда связываюсь в случае нагрузки.

Ответил 21/08/2008 d 15:48
источник пользователем

голоса
2

Это может быть просто опечатка, но в коде, если вы только сослаться на первый выпадающий при настройке источника данных:

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

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

Источник данных для box2не установлен.

Ответил 21/08/2008 d 18:12
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more