[C#.NET] Combobox synchroniseert met andere comboboxes?

Pagina: 1
Acties:

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
Loop ik nu tegen iets raars aan in .NET 2.0. Stel ik de datasource van 3 comboboxes in op dezelfde collection, verspringen alle 3 de comboboxes als je een andere selectie doet?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
MonstersCollection monsters = new MonstersCollection(); //LLBLGen Generated Collection
monsters.getMulti(null);
cbxLab1.ValueMember = "MonstersID"; 
cbxLab1.DisplayMember = "Aanduiding";
cbxLab1.DataSource = monsters;

cbxLab2.ValueMember = "MonstersID"; 
cbxLab2.DisplayMember = "Aanduiding";
cbxLab2.DataSource = monsters;

cbxLab3.ValueMember = "MonstersID"; 
cbxLab3.DisplayMember = "Aanduiding";
cbxLab3.DataSource = monsters;

of
C#:
1
2
3
4
5
6
7
8
9
10
11
cbxLab1.DataSource = data.Tables("Monsters");
cbxLab1.DisplayMember = "Aanduiding";
cbxLab1.ValueMember = "MonstersID";

cbxLab2.DataSource = data.Tables("Monsters");
cbxLab2.DisplayMember = "Aanduiding";
cbxLab2.ValueMember = "MonstersID";

cbxLab3.DataSource = data.Tables("Monsters");
cbxLab3.DisplayMember = "Aanduiding";
cbxLab3.ValueMember = "MonstersID";


Waarom verspringen alle comboboxen mee als je een selectie doet? Bugje?

[ Voor 9% gewijzigd door Mastermind op 03-03-2006 15:53 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Nee, da's omdat ze allemaal aan dezelfde DataView gebinded worden.
Als je dat niet wil, zal je iedere combobox aan een andere DataView moeten binden.

code:
1
2
cbxLab1.DataSource = new DataView (myDataTable);
cbxLab2.DataSource = new DataView (myDataTable);


achter de schermen gebruikt .NET ook de DataView van je table als datasource, ook al specifieer je dat niet. De default dataview wordt nl. gebruikt in jouw geval.

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
That makes no sense. Waarom wordt de geselecteerde waarde in alle comboboxes gewijzigd? Hij heeft toch geen .Selected achter de schermen?

Als datasource wordt de collection aangegeven; deze wordt in de combobox overgezet. In de combobox wordt de DisplayMember getoond van de collection.

Als er een selectie wordt gedaan zou dit geen invloed moeten hebben op de andere comboboxes, omdat de combobox zelf de collection bevat. Zelfs als het wel zo was, zou achter de schermen een .Selected bijgehouden moeten worden?

Om namelijk een entity uit de collection in de ComboBox (die dezelfde is als die in de datasource) te halen, kun je de SelectedValue zoeken en in die entity de fieldwaarde toekennen en dit saven. Dit staat dus geheel los van de datasource zelf.
8)7

[ Voor 13% gewijzigd door Mastermind op 03-03-2006 16:35 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Omdat je combobox gebind is aan een DataView als datasource, en omdat er voor iedere DataSource een BindingManager is die de CurrentPosition (van het geselecteerde item dus) opslaat.
Aangezien je dus iedere keer aan dezelfde dataview binded, heb je dus ook slechts 1 datasource, en wordt dus i edere keer dezelfde bindingmanager gebruikt.

De combobox toont enkel de collection; hij bevat ze niet.

Probeer de code maar eens even uit die ik gaf.

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
Ik weet wel dat het wel werkt als je gewoon nieuwe instanties van de datasource maakt, maar wij vonden het gewoon vreemd dat het intern gelinkt was.

Kennelijk was ik in de war met een ASP.NET pagina, waarbij na de DataSource instellen nog een DataBind() gebeurt, waardoor de collection wel in de control zelf staat ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
Nouja, ze staan er wel in, maar, het is de CurrencyManager (wat een naam) die de positie bepaalt van je gebindede data.

Zie het zo: je hebt gewoon iedere keer dezelfde 'view' op die data in je 3 comboboxes. Dus, als je in combobox 1 iets kiest, wordt dat ook in combobox2 en 3 veranderd, omdat ze dezelfde view hebben. De CurrentPosition van de View wordt aangepast, en dus zorgen de andere controls die aan diezelfde view gebinded zijn, dat ze ook datzelfde record tonen.

[ Voor 61% gewijzigd door whoami op 03-03-2006 18:21 ]

https://fgheysels.github.io/

Pagina: 1