Problem:
In einer Datenbank befinden sich mehrere Stammdaten-Tabellen, beispielsweise:
AnredeArten, Felder AnredeArtID, AnredeArtText
Hobbys, Felder HobbyID, HobbyText
Der Anwender soll die Möglichkeit haben, diese Stammtabellen in einer WPF-Anwendung pflegen zu können, hier ein erster Versuch:
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
44
45
46
47
48
49
50
| <Page x:Class="Kanzlei.Page_Stammdaten"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page_Stammdaten"
Loaded="Page_Loaded"
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition />
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel
Name="spButtons"
Grid.Column="0"
>
<Button Name="btnAnreden" Content="Anreden" />
<Button Name="btnHobbys" Content="Hobbys" Click="btnHobbys_Click" />
</StackPanel>
<ListView
Name="lvStammdaten"
Grid.Column="1"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}" Height="auto"
>
<ListView.View>
<GridView>
<GridViewColumn Header="Eintrag" DisplayMemberBinding="{Binding Eintrag, Mode=TwoWay}"/>
</GridView>
</ListView.View>
</ListView>
<StackPanel
Name="spEdit"
Grid.Column="2">
<TextBox Name="tbEintrag" MinWidth="100" Text="{Binding Path=Eintrag, Mode=TwoWay}"/>
<Button Name="btnChange" Content="Ändern" Click="btnChange_Click"/>
</StackPanel>
</Grid>
</Page> |
Es folgte mein erster Versuch, die Datenbindung zu realisieren:
1
2
3
4
5
6
7
8
| private void btnHobbys_Click(object sender, RoutedEventArgs e)
{
this.DataContext =
from hobby in dc.Hobbies
orderby hobby.HobbyText
select new { Eintrag = hobby.HobbyText };
}
|
Mein Ansatz war, die unterschiedlichen Spalten aus den Stammtabellen (AnredeArtText, HobbyText …) immer in ein Feld „Eintrag“ einzulesen und Gridview und Textbox an dieses Feld zu binden.
Die Folge war folgende Fehlermeldung:
TwoWay- oder OneWayToSource-Bindungen funktionieren nicht mit der schreibgeschützten Eigenschaft "Eintrag" vom Typ "<>f__AnonymousType0`1[System.String]".
Bindung der Textbox an anonyme Typen (select new { Eintrag = hobby.HobbyText }) funktioniert also offensichtlich nicht, ich habe also eine neue Klasse erstellt und die Daten in dieser neuen Form eingelesen:
1
2
3
4
5
6
7
8
9
10
11
12
| class Stammdaten
{
public string Eintrag { get; set; }
}
private void btnHobbys_Click(object sender, RoutedEventArgs e)
{
this.DataContext =
from hobby in dc.Hobbies
orderby hobby.HobbyText
select (new Stammdaten { Eintrag=hobby.HobbyText });
} |
Jetzt funktioniert die Bindung zwar - leider aber nur scheinbar, denn die Änderungen funktionieren zwar in der GUI, werden aber nicht in die Datenbank zurück geschrieben.
Auch hier der Code:
1
2
3
4
5
6
7
8
9
10
11
| private void btnChange_Click(object sender, RoutedEventArgs e)
{
try
{
dc.SubmitChanges();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
} |
Warum werden die Daten nicht dauerhaft in der Datenbank gespeichert?
Jetzt kommt meine eigentliche Frage:
Dieser beschriebene Ansatz ist doch viel zu unflexibel. Wäre es nicht besser, von einer leeren Gridview auszugehen und die erforderlichen Spalten/Bindungen dynamisch im Behind-Code zu erzeugen?
Leider habe ich noch keine Möglichkeit gefunden, Spalten dynamisch zu erzeugen – von der Datenbindung ganz zu schweigen.
Kann mich bitte jemand in die richtige Richtung bringen?
Vielen Dank im Voraus, Sven