In mijn te gebruiken XML heet het te gebruiken object "ZB". Dat object "ZB" heeft 2 punten, "AAD" en "AAG". Beide punten hebben coördinaten, gescheiden met een pipe "|" teken. Dit XML wordt zo aangeleverd, en hier moet ik het dan ook mee doen.
In de te ontwikkelen software is gekozen voor het importeren van de XML in een dataset. Dat doe ik met onderstaande code:
Dit werkt. Het resultaat is een dataset met 4 tabellen: ZB, AAE, AAG en point.
Er zijn automatisch relaties gelegd tussen de objecten en hun punten met coördinaten. Dit gebeurd via verborgen kolommen met id's. De connectie tussen deze tabellen heb ik weergegeven in 2 datagrids, die aan elkaar gekoppeld zijn. De eerste datagrid laat de tabel ZB zien, de tweede datagrid laat de bijhorende coördinaten zien van het punt AAE. Dit doe ik met onderstaande code:
Tot zover was het even puzzelen naar de preciese aanroep van de relaties, maar het werkt. Hetzelfde geldt voor het databinden van labels etc, waarbij ik de coördinaten laat zien van een in de datagrid met ZB objecten geselecteerd object. Dit gaat met onderstaande code:
Wat wil ik nu eigenlijk?
Ik wil in 1 datagrid (of liever in 1 tabel) zowel de kolommen van de tabel ZB hebben, als ook de coördinaten van de punten AAE en AAG. Dit lijkt me goed mogelijk, alleen krijg ik het niet voor elkaar om de juiste expressie toe te voegen aan een custom column. In alle voorbeelden bestaat er een directe link tussen de velden, nu zit er een koppeltabel tussen. Ik heb het geprobeerd met onderstaande opties, maar helaas zonder resultaat. Uiteindelijk ben ik gewoon maar gaan gokken, maar ook dat leverde niets op.
Ik kom er niet uit, al heb ik het gevoel dat ik erg dichtbij zit. Mocht je een XML willen gebruiken om te testen, je zou het kleine stukje XML kunnen gebruiken wat hieronder staat vermeld:
In de te ontwikkelen software is gekozen voor het importeren van de XML in een dataset. Dat doe ik met onderstaande code:
Visual Basic .NET:
1
2
3
| Dim myDS As DataSet Dim fsReadXml As New System.IO.FileStream(myXMLFile, System.IO.FileMode.Open) myDS.ReadXml(fsReadXml) |
Dit werkt. Het resultaat is een dataset met 4 tabellen: ZB, AAE, AAG en point.
Er zijn automatisch relaties gelegd tussen de objecten en hun punten met coördinaten. Dit gebeurd via verborgen kolommen met id's. De connectie tussen deze tabellen heb ik weergegeven in 2 datagrids, die aan elkaar gekoppeld zijn. De eerste datagrid laat de tabel ZB zien, de tweede datagrid laat de bijhorende coördinaten zien van het punt AAE. Dit doe ik met onderstaande code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
| Dim myBS As New BindingSource myBS.DataSource = myDS DataGridView1.DataSource = myBS DataGridView1.DataMember = "ZB" DataGridView2.DataSource = myBS DataGridView2.DataMember = "ZB.ZB_AAE.AAE_point" |
Tot zover was het even puzzelen naar de preciese aanroep van de relaties, maar het werkt. Hetzelfde geldt voor het databinden van labels etc, waarbij ik de coördinaten laat zien van een in de datagrid met ZB objecten geselecteerd object. Dit gaat met onderstaande code:
Visual Basic .NET:
1
2
| TextBox1.DataBindings.Clear() TextBox1.DataBindings.Add(New Binding("text", myBS, "ZB.ZB_AAG.AAG_point.pos")) |
Wat wil ik nu eigenlijk?
Ik wil in 1 datagrid (of liever in 1 tabel) zowel de kolommen van de tabel ZB hebben, als ook de coördinaten van de punten AAE en AAG. Dit lijkt me goed mogelijk, alleen krijg ik het niet voor elkaar om de juiste expressie toe te voegen aan een custom column. In alle voorbeelden bestaat er een directe link tussen de velden, nu zit er een koppeltabel tussen. Ik heb het geprobeerd met onderstaande opties, maar helaas zonder resultaat. Uiteindelijk ben ik gewoon maar gaan gokken, maar ook dat leverde niets op.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Dim Test As DataColumn = myDS.Tables("ZB").Columns.Add("test", GetType(String)) Test.Expression = "ZB.ZB_AAE.AAE_point" 'Test.Expression = "Child(ZB.ZB_AAE).point" 'Test.Expression = "Child(ZB_AAE).point" 'Test.Expression = "Child(point)" 'Test.Expression = "Child(pos)" 'Test.Expression = "ZB_AAE.point" 'Test.Expression = "ZB.ZB_AAE.point.pos" 'Test.Expression = "point" 'Test.Expression = "point.pos" 'Test.Expression = "Parent.ZB_AAE.AAE_point.pos" 'Test.Expression = "Parent(ZB_AAE).AAE_point" 'Test.Expression = "Parent.ZB" 'Test.Expression = "ZB_AAE.AAE_point.pos" 'Test.Expression = "Child.ZB_AAE.point.pos" |
Ik kom er niet uit, al heb ik het gevoel dat ik erg dichtbij zit. Mocht je een XML willen gebruiken om te testen, je zou het kleine stukje XML kunnen gebruiken wat hieronder staat vermeld:
XML:
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
| <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <!-- File Header --> <DATA xmlns:nl= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:EN13508.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml"> <ZB> <AAA>AAA</AAA> <AAD>1</AAD> <AAE> <gml:point srsName="Netherlands-RD" srsDimension="2"> <gml:pos>123|456</gml:pos> </gml:point> </AAE> <AAF>2</AAF> <AAG> <gml:point srsName="Netherlands-RD" srsDimension="2"> <gml:pos>234|567</gml:pos> </gml:point> </AAG> </ZB> <ZB> <AAA>AAA</AAA> <AAD>3</AAD> <AAE> <gml:point srsName="Netherlands-RD" srsDimension="2"> <gml:pos>345|678</gml:pos> </gml:point> </AAE> <AAF>4</AAF> <AAG> <gml:point srsName="Netherlands-RD" srsDimension="2"> <gml:pos>456|789</gml:pos> </gml:point> </AAG> </ZB> </DATA> |