2010-10-19 20 views
2

J'essaie de créer un formulaire simple qui contient des zones de texte tirées d'une base de données dans mon projet. J'utilise la méthode GetData() de l'adaptateur de table dans le fichier xsd pour remplir le contexte de données. Je veux mettre à jour l'une de ces zones de texte et faire refléter les changements dans la base de données. Les zones de texte remplissent bien, mais les modifications ne le rendent pas à la base de données.WPF TextBox ne mettra pas à jour la source

Je possède ce code dans mon constructeur de la classe de fenêtre

 table = adapter.GetData(); 
     this.DataContext = table; 

Et dans le XAML, je suis lier à une zone de liste

<ListBox Name="lstItems" ItemsSource="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Path=name, Mode=TwoWay, 
        UpdateSourceTrigger=LostFocus}">       
       </TextBox> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

J'ai été déconner avec ça pour un moment et ne peut tout simplement pas l'obtenir. Il semble que cela devrait être assez simple. Suis-je en supposant à tort que wpf peut même faire ce type de liaison de données? Faites-moi savoir si vous avez besoin de savoir quoi que ce soit d'autre. Merci.

Répondre

2

adapter.GetData() retournera un DataSet contenant les données de la base de données. Cet ensemble de données est détaché de votre base de données, c'est-à-dire que les modifications apportées à l'ensemble de données ne sont pas propagées automatiquement vers la base de données.

Pour enregistrer les modifications dans la base de données, vous pouvez utiliser le Update method of your DataAdapter. Donc, en fait, votre problème n'a rien à voir avec WPF: C'est ainsi que fonctionne l'accès à la base de données via les adaptateurs de données ADO.NET.

+0

Ok, merci d'avoir éclairci ça. Je ne connais pas tous les types de méthodes d'accès aux données, mais existe-t-il une méthode plus proche de ce que j'imagine? – wangburger

+1

* Entity Framework * semble être la méthode «de pointe» pour la liaison de données WPF, mais je n'en ai pas l'expérience personnelle. Quoi qu'il en soit, je pense que vous devez également appeler explicitement une commande "save changes". – Heinzi

0

Les modifications doivent être reflétées dans "table.name".

Je ne sais pas ce que le "adapter.GetData()" retourne dans cette situation, mais il est probable que vous devrez indiquer à la table de persister ses modifications afin de les voir dans la base de données.

1

Votre adaptateur reçoit les données - adapter.GetData() - et votre zone de texte définit la valeur dans vos données - table.name comme le dit @Reed. Les données renvoyées sont une représentation de vos données dans la base de données. Pensez-y comme si quelqu'un demandait un rapport de la part du db et obtenait une série de rapports papier.

Cependant, rien ne déclenche l'enregistrement de vos données dans la base de données. Vous voulez probablement quelque chose pour enregistrer les données de la même manière que vous l'obtenez.

Étant donné que votre zone de texte peut soit changer lorsque vous changez de focus ou même lorsque vous tapez une lettre (par défaut c'est par focus), vous voulez probablement quelque chose d'autre pour enregistrer les données. Voulez-vous vraiment l'enregistrer sur le db à chaque frappe? WPF effectue la liaison aux objets, mais pas d'habitude à la base de données.

Si vous voulez vraiment l'enregistrer lorsque vous changez le focus, vous pouvez réagir à cet événement. Sinon, ajoutez un bouton "Enregistrer", à utiliser une fois que les formulaires ont été remplis.