2015-12-08 2 views
0

J'ai déposé une table sur une fenêtre XAML puis modifié le code pour utiliser l'événement roweditending sur la grille de données pour mettre à jour la base de données SQL locale. Ça ne marche jamais. Je ne vais pas ajouter, mettre à jour ou supprimer des enregistrements dans les tables de la base de données.La méthode de mise à jour Datagrid Tableadapter échoue

Voici le code XAML -

<Grid DataContext="{StaticResource attenderTableViewSource}"> 
     <DataGrid x:Name="attenderTableDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="10,10,10,325" RowDetailsVisibilityMode="VisibleWhenSelected" IsSynchronizedWithCurrentItem="True" RowEditEnding="attenderTableDataGrid_RowEditEnding" > 
      <DataGrid.Columns> 
       <DataGridTextColumn x:Name="first_NameColumn" Binding="{Binding First Name, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="First Name" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="last_NameColumn" Binding="{Binding Last Name, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Last Name" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="address_Line_1Column" Binding="{Binding Address Line 1, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Address Line 1" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="address_Line_2Column" Binding="{Binding Address Line 2, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Address Line 2" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="address_Line_3Column" Binding="{Binding Address Line 3, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Address Line 3" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="cityColumn" Binding="{Binding City, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="City" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="stateColumn" Binding="{Binding State, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="State" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="zipColumn" Binding="{Binding Zip, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Zip" Width="SizeToHeader"/> 
       <DataGridTextColumn x:Name="telephoneColumn" Binding="{Binding Telephone, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Telephone" Width="SizeToHeader"/> 
       <DataGridCheckBoxColumn x:Name="_Member_Column" Binding="{Binding Member?, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Member?" Width="SizeToHeader"/> 
       <DataGridCheckBoxColumn x:Name="_Child_Column" Binding="{Binding Child?, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}" Header="Child?" Width="SizeToHeader"/> 
      </DataGrid.Columns> 
     </DataGrid> 

    </Grid> 

Voici le code cs

namespace AttendanceRecPro 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
      private AttendanceRecPro.AttendanceRecProDataSet attendanceRecProDataSet = new AttendanceRecProDataSet(); 
     private AttendanceRecPro.AttendanceRecProDataSetTableAdapters.AttenderTableTableAdapter attendanceRecProDataSetAttenderTableTableAdapter = new AttendanceRecPro.AttendanceRecProDataSetTableAdapters.AttenderTableTableAdapter(); 
     private System.Windows.Data.CollectionViewSource attenderTableViewSource = new CollectionViewSource(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

      AttendanceRecPro.AttendanceRecProDataSet attendanceRecProDataSet = ((AttendanceRecPro.AttendanceRecProDataSet)(this.FindResource("attendanceRecProDataSet"))); 
      // Load data into the table AttenderTable. You can modify this code as needed. 
      attendanceRecProDataSetAttenderTableTableAdapter.Fill(attendanceRecProDataSet.AttenderTable); 
      System.Windows.Data.CollectionViewSource attenderTableViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("attenderTableViewSource"))); 
      attenderTableViewSource.View.MoveCurrentToFirst(); 

     } 

     private void attenderTableDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
     { 

      if (e.EditAction == DataGridEditAction.Commit) 
      { 

       try 
       { 
        int rc = 0; 

        rc = attendanceRecProDataSetAttenderTableTableAdapter.Update(attendanceRecProDataSet.AttenderTable); 

        attendanceRecProDataSet.AcceptChanges(); 

        MessageBox.Show("Return Code: " + rc); 

       } 

       catch (Exception ex) 
       { 

        MessageBox.Show(ex.ToString()); 

       } 

       MessageBox.Show("trying to update..."); 

      } 

     } 
    } 
} 

Le code de retour est 0 si aucune ligne ne sont mis à jour. Il n'enregistre jamais les données entre les exécutions. J'ai également vérifié que les propriétés de l'ensemble de données sont "ne pas copier" et ont copié une version du fichier .mdf dans le répertoire bin/debug. J'ai passé près d'une semaine à regarder ça et je ne vois pas où il me manque quelque chose. Mais aucune modification, ajout de ligne ou modification de ligne ne mettra à jour la base de données. La grille ne me donne pas d'erreur, pas plus que le bloc catch/try.

De plus, il existe une clé primaire "AttenderID" sur le "AttenderTable" dans l'ensemble de base de données en tant que graine d'identité 1 incrément 1 et définie en tant que clé primaire. Il devrait juste s'incrémenter automatiquement à chaque fois et je n'ai pas d'élément dessus car il ne devrait pas être touché par l'utilisateur. Je ne crois pas que ce soit un problème car la base de données devrait le mettre à jour.

S'il vous plaît aider avec quel événement je devrais avoir la méthode de mise à jour tableadapter dans ... D'autres utilisent l'événement RowEditEnding et disent qu'ils le font fonctionner mais je ne peux pas comprendre pour la vie de moi comment.

+0

J'ai déplacé la mise à jour à l'événement SelectionChanged de la grille de données et cela fonctionne très bien. Les modifications de la grille de données ont été mises à jour dans l'ensemble de données à ce stade et la méthode .update transfère ensuite ces modifications dans la base de données. J'ai également ajouté le même code à la méthode Window_Closing afin de mettre à jour les changements de dernière minute avant que l'utilisation ne quitte le programme. –

Répondre

0

La réponse est de déplacer la méthode .update vers l'événement SelectionChanged de la grille de données. Voir le commentaire ci-dessus.