Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
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
Так что теперь у нас есть 2 поля со списком, привязанные к этому массиву, и все работает нормально. Но когда вы меняете значение одного поля со списком, он меняет BOTH полей со списком на тот, который вы только что выбрали.
Теперь я знаю, что массивы всегда передаются по ссылке (узнал это, когда узнал C :D), но с какой стати поля со списком будут меняться вместе? Я не верю, что элемент управления combo box вообще изменяет коллекцию.
В качестве обходного пути, не это бы достичь функциональности, которая ожидается / желаемый
ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Это связано с тем, как привязки данных настраиваются в рамках dotnet, особенно BindingContext . На высоком уровне это означает, что если вы не указали иное, то каждая форма и все элементы управления формы имеют один и тот же BindingContext . При установке свойства DataSource ComboBox будет использовать BindingContext для получения ConcurrenyMangager , который обертывает список. ConcurrenyManager отслеживает такие вещи, как текущая выбранная позиция в списке.
Когда вы устанавливаете DataSource второго ComboBox , он будет использовать тот же BindingContext (формы), который даст ссылку на тот же ConcurrencyManager , что и выше, используемый для настройки Привязок данных.
Чтобы получить более подробное объяснение, смотрите BindingContext .
Лучшим обходным путем (в зависимости от размера источника данных) является объявление двух объектов BindingSource (new as of 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.