2015-12-08 3 views
0

Я опустил таблицу в окно XAML, а затем изменил код, чтобы использовать событие roweditending в datagrid для обновления локальной базы данных sql. Он никогда не работает. Я не буду добавлять, обновлять или удалять любые записи в таблицах базы данных.Ошибка метода обновления таблицы Datagrid

Вот код 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> 

Вот код 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..."); 

      } 

     } 
    } 
} 

Код возврата 0, так что никаких строк не обновляются. Он никогда не сохраняет данные между прогонами. Я также проверил, что свойства набора данных «не копируются» и скопировали версию файла .mdf в каталог bin/debug. Я потратил почти неделю на это и не вижу, где чего-то не хватает. Но никакие изменения, добавленные строки или измененные строки не будут обновлять базу данных. Сетка не дает мне ошибки, и блок catch/try не блокируется.

Также имеется первичный ключ «AttenderID» в «AttenderTable» в базе данных, заданный как инкремент 1 семени идентичности, и устанавливается как первичный ключ. Он должен просто автоматически увеличивать каждый раз, и у меня нет элемента, потому что он не должен касаться пользователя. Я не думаю, что это проблема, потому что база данных должна ее обновлять.

Пожалуйста, помогите с каким событием у меня должен быть метод обновления tableadapter в ... Другие используют событие RowEditEnding и говорят, что они заставляют его работать, но я не могу понять, как поживаете.

+0

Я переместил обновление в событие SelectionChanged в datagrid, и это отлично работает. Изменения в datagrid были обновлены в наборе данных в этот момент, а затем метод .update переносит эти изменения в базу данных. Я также добавил тот же код к методу Window_Closing, чтобы он обновлял любые изменения в последнюю минуту до того, как выйдет из программы. –

ответ

0

Ответ заключается в том, чтобы переместить метод .update в событие SelectionChanged объекта datagrid. См. Комментарий выше.