2009-10-29 4 views
1

У меня есть приложение WinForm с сеткой, которая содержит ComboBox для каждой строки. Все привязаны к одной коллекции (коллекция может измениться позади, поэтому я не хочу иметь разные коллекции для каждого Combo, а также стоимость памяти). Проблема в том, что когда я выбираю какой-либо объект в одном комбо, он изменяет выбранный объект на каждом комбо. Вот код, который вы можете запустить и легко воспроизвести.Поведение мисс в .Net Элементы управления DataSource

public Form1() 
     { 
      InitializeComponent(); 

      this.comboBox1 = new System.Windows.Forms.ComboBox(); 
      List<int> numList = new List<int>(){1,2,3,4}; 
      this.comboBox1.FormattingEnabled = true; 
      this.comboBox1.Location = new System.Drawing.Point(33, 169); 
      this.comboBox1.Name = "comboBox1"; 
      this.comboBox1.Size = new System.Drawing.Size(126, 21); 
      this.comboBox1.TabIndex = 3; 
      this.comboBox1.DataSource = numList; // BINDING TO NUMLIST 

      this.comboBox2 = new System.Windows.Forms.ComboBox(); 
      this.comboBox2.FormattingEnabled = true; 
      this.comboBox2.Location = new System.Drawing.Point(243, 367); 
      this.comboBox2.Name = "comboBox2"; 
      this.comboBox2.Size = new System.Drawing.Size(126, 21); 
      this.comboBox2.TabIndex = 4; 
      this.comboBox2.DataSource = numList; // BINDING TO NUMLIST (THE SAME LIST 

      this.Controls.Add(this.comboBox2); 
      this.Controls.Add(this.comboBox1); 
     } 

Просто сделайте форму и вставить декларацию ComboBox 1 и 2. Любая идея, как это может происходить. Я имею в виду, что если это простой список, он не отслеживает выбранный объект. Что происходит за DataSource?

+5

Я действительно ненавижу ее, это означает, что мисс Поведение! – leppie

+0

Я действительно прочитал вопрос, потому что мне было интересно встретиться с ней. – Paddy

ответ

4

Валютный менеджер является общим, если вы используете одну и ту же ссылку на источник данных. Один Хитрость заключается в том, чтобы установить привязку-контекст каждого управления:

ctrl.BindingContext = new BindingContext(); 

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

+0

Спасибо большое !!!!!!! Это избавляет меня от необходимости многократно обновлять каждый список. Также хочу поблагодарить всех остальных ребят, и это была и интересная статья, чтобы читать .. – jmayor

0

Если вы хотите связать, используйте метод linq ToList(). Это создаст новый список, поэтому они станут несвязанными.

+0

Простите, что это не сработало ... это продолжает происходить ... Я думаю, что это что-то создает за DataSource, и делает все comboBoxes указывающими на одно и то же, но я могу сказать ... – jmayor

+0

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

5

Вам нужно использовать отдельные списки, если вы привязываетесь к тем же спискам, что и ожидалось.

+0

Почему это поведение по умолчанию? Представьте, что у меня 10K строк? мне нужно иметь списки 10K? и, кроме того, если я свяжу простой общий список коллекций, это заставляет выглядеть так, как будто список отслеживает выбранный объект .. и это простой список ... Я бы взял на себя это, если бы это было похоже, и ObservableCollection или какой-то просмотреть объект. – jmayor

+0

@jmayor - «Валютный менеджер используется для синхронизации данных, связанных друг с другом (показывая данные из одной записи). Объект CurrencyManager выполняет это путем управления набором связанных данных, предоставленных источником данных». –

1

Прочитайте это: Data Binding in .NET/C# Windows Forms

Вы найдете поведение, которое вы видите, как на самом деле правильно. Основной причиной является CurrencyManager.

Смежные вопросы