Я опустил таблицу в окно 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 и говорят, что они заставляют его работать, но я не могу понять, как поживаете.
Я переместил обновление в событие SelectionChanged в datagrid, и это отлично работает. Изменения в datagrid были обновлены в наборе данных в этот момент, а затем метод .update переносит эти изменения в базу данных. Я также добавил тот же код к методу Window_Closing, чтобы он обновлял любые изменения в последнюю минуту до того, как выйдет из программы. –