.NET GUI

.NET Community rund um alle Graphical User Interface (GUI) Themen.
Willkommen bei .NET GUI. Anmeldung | Registrieren | Hilfe | Impressum | Forumsregeln
in Suchen

Gridview: Spalten und Datenbindung zur Laufzeit erzeugen

Letzter Beitrag 09-18-2008 11:28 von accelle. 1 Antworten.
Seite 1 von 1 (2 Treffer)
Beiträge sortieren: Zurück Weiter
  • 09-08-2008 14:22

    • wallace693
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 06-26-2008
    • Weiden in der Oberpfalz
    • Beiträge 18
    • Punkte 240

    Gridview: Spalten und Datenbindung zur Laufzeit erzeugen

    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

     

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 09-18-2008 11:28 Antwort zu

    • accelle
    • Top 10 Mitwirkender
    • Registriert am 08-08-2008
    • Beiträge 68
    • Punkte 1.105

    AW: Gridview: Spalten und Datenbindung zur Laufzeit erzeugen

    Hallo Sven,

    wie wäre es, wenn Du die Daten im CodeBehind in einer DataTable (oder in mehreren verknüpften) aufbaust und diese DataTable an Dein Gridview bindest?

    Ich habe zum DataBinding hier (
    O'Reilly - Programming WPF, 2nd Edition. Gibt's als free PDF Download (Google hilft!)) sehr gut aufgebaute Informationen gefunden. Falls Deine Informationen hierarchisch sind, hilft Dir vielleicht auch ein TreeListView. Siehe diesen Thread: WPF TreeListView: so geht's. Der ist zwar an eine XML-Struktur gebunden. Müsste jedoch ein leichtes sein, ihn umzubauen und an einen DataSet mit mehreren Tables zu hängen. Oder Du schiebst Deine Daten gleich in einen XML-Baum.

    Hoffe, das hilft.

    Gruß
    Peter

    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
Seite 1 von 1 (2 Treffer)
Powered by Community Server (Commercial Edition)    Hosting powered by 69° media solutions