Ik zit al een paar dagen te vechten met een raar probleem waar ik maar niet uitkom. Het komt er op neer dat de values van de BindingSource niet geupdate worden.
Requirement van mijn voorbeeld:
- Form met een DataGridView
- Een class "Car" (zie onder).
De reden dat ik er een "CurrentInstance" property in heb gezet heeft te maken met het eenvoudig uitkunnen lezen van de waarde in de DataGridView.
Ik voeg op runtime als gebruiker wat waarden toe en ik zie dat het grid gevuld wordt. In dit geval voeg ik 2 waardes toe, "Car 2" en "Car 3". Als ik nu break en kijk wat de waarden in de DataGridView zijn dan krijg ik er de volgende waarden uit:
Zover lijkt het dus allemaal te kloppen! Alleen als ik dan de BindingSource bekijk dan ziet het resultaat er zo uit:
Er zitten er dus wel 2 in maar van de waardes klopt helemaal niets. Alsof er twee nieuwe instanties zijn aangemaakt maar de waardes van de DataGridView vervolgens niet zijn gekoppeld op het moment dat de keuze is gemaakt. Ik begrijp er niets van want die 2 moeten 1-op-1 gelinked zijn toch?? Ik moet wat over het hoofd zien...
Ik hoop dat iemand mij verder op weg kan helpen!
Requirement van mijn voorbeeld:
- Form met een DataGridView
- Een class "Car" (zie onder).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class Car { private int id; private string name; public int ID { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } public Car CurrentInstance { get { return this; } } } |
De reden dat ik er een "CurrentInstance" property in heb gezet heeft te maken met het eenvoudig uitkunnen lezen van de waarde in de DataGridView.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| public partial class formTest : Form { DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn(); IList<Car> dataGridDataSource = new List<Car>(); public formTest() { InitializeComponent(); } private void formTest_Load(object sender, EventArgs e) { column.DisplayMember = "Name"; column.ValueMember = "CurrentInstance"; column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; column.DataSource = createBindingSource(); dataGridView.Columns.Add(column); bindingSource.DataSource = dataGridDataSource; } private BindingSource createBindingSource() { Car item1 = new Car(); item1.ID = 1; item1.Name = "Car 1"; Car item2 = new Car(); item2.ID = 2; item2.Name = "Car 2"; Car item3 = new Car(); item3.ID = 3; item3.Name = "Car 3"; IList<Car> itemList = new List<Car>(); itemList.Add(item1); itemList.Add(item2); itemList.Add(item3); BindingSource bindingSource = new BindingSource(); bindingSource.DataSource = itemList; return bindingSource; } } } |
Ik voeg op runtime als gebruiker wat waarden toe en ik zie dat het grid gevuld wordt. In dit geval voeg ik 2 waardes toe, "Car 2" en "Car 3". Als ik nu break en kijk wat de waarden in de DataGridView zijn dan krijg ik er de volgende waarden uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ?dataGridView[0, 0].Value {MBMS.GUI.Forms.Car} CurrentInstance: {MBMS.GUI.Forms.Car} ID: 2 id: 2 Name: "Car 2" name: "Car 2" ?dataGridView[0, 1].Value {MBMS.GUI.Forms.Car} CurrentInstance: {MBMS.GUI.Forms.Car} ID: 3 id: 3 Name: "Car 3" name: "Car 3" |
Zover lijkt het dus allemaal te kloppen! Alleen als ik dan de BindingSource bekijk dan ziet het resultaat er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ?bindingSource[0] {MBMS.GUI.Forms.Car} CurrentInstance: {MBMS.GUI.Forms.Car} ID: 0 id: 0 Name: null name: null ?bindingSource[1] {MBMS.GUI.Forms.Car} CurrentInstance: {MBMS.GUI.Forms.Car} ID: 0 id: 0 Name: null name: null |
Er zitten er dus wel 2 in maar van de waardes klopt helemaal niets. Alsof er twee nieuwe instanties zijn aangemaakt maar de waardes van de DataGridView vervolgens niet zijn gekoppeld op het moment dat de keuze is gemaakt. Ik begrijp er niets van want die 2 moeten 1-op-1 gelinked zijn toch?? Ik moet wat over het hoofd zien...
Ik hoop dat iemand mij verder op weg kan helpen!
PSN: Norfirin