Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagrid Tableadapter更新方法失败_C#_Wpf_Datagrid_Tableadapter - Fatal编程技术网

C# Datagrid Tableadapter更新方法失败

C# Datagrid Tableadapter更新方法失败,c#,wpf,datagrid,tableadapter,C#,Wpf,Datagrid,Tableadapter,我在XAML窗口中放置了一个表,然后修改了代码以使用datagrid上的roweditending事件来更新本地sql数据库。它永远不起作用。我不会在数据库表中添加、更新或删除任何记录 这是xaml代码- 这是cs代码 ecpro { /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口:窗口 { 私人AttendanceECPro.AttendanceECProDataSet AttendanceECProDataSet=新AttendanceECProDa

我在XAML窗口中放置了一个表,然后修改了代码以使用datagrid上的roweditending事件来更新本地sql数据库。它永远不起作用。我不会在数据库表中添加、更新或删除任何记录

这是xaml代码-

这是cs代码
ecpro
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
私人AttendanceECPro.AttendanceECProDataSet AttendanceECProDataSet=新AttendanceECProDataSet();
私有AttendanceCPRO.AttendanceCProDataSetTableAdapters.AttenderTableAdapter AttendanceCProDataSetAttenderTableAdapter=新AttendanceCPRO.AttendanceCProDataSetTableAdapters.AttenderTableAdapter();
private System.Windows.Data.CollectionViewSource attenderTableViewSource=新的CollectionViewSource();
公共主窗口()
{
初始化组件();
}
已加载私有无效窗口(对象发送器、路由目标)
{
AttendanceECPro.AttendanceECProDataSet AttendanceECProDataSet=((AttendanceECPro.AttendanceECProDataSet)(此.FindResource(“AttendanceECProDataSet”)));
//将数据加载到表AttenderTable中。您可以根据需要修改此代码。
AttendanceECProDataSetAttenderTableAdapter.Fill(AttendanceECProDataSet.AttenderTable);
System.Windows.Data.CollectionViewSource attenderTableViewSource=((System.Windows.Data.CollectionViewSource)(this.FindResource(“attenderTableViewSource”)));
attenderTableViewSource.View.MoveCurrentToFirst();
}
私有void attenderTableDataGrid_RowEditEnding(对象发送方,DataGridRowEditEndingEventArgs e)
{
if(e.EditAction==DataGridEditAction.Commit)
{
尝试
{
int rc=0;
rc=AttendanceECProDataSetAttenderTableAdapter.Update(AttendanceECProDataSet.AttenderTable);
AttendanceCproDataSet.AcceptChanges();
MessageBox.Show(“返回代码:+rc”);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
显示(“正在尝试更新…”);
}
}
}
}
返回代码为0,因此不会更新任何行。它从不在两次运行之间保存数据。我还检查了数据集属性是否为“不复制”,并已将.mdf文件的一个版本复制到bin/debug目录中。我已经花了将近一个星期的时间来研究这个问题,但我没有发现我遗漏了什么。但任何更改、添加的行或修改的行都不会更新数据库。网格没有给我错误,catch/try块也没有

此外,数据库中的“AttenderTable”上有一个主键“AttenderID”,设置为identity seed 1 increment 1,并设置为主键。它应该每次都自动递增,我没有一个项目,因为它不应该被用户触摸。我不认为这是一个问题,因为数据库应该更新它


请帮助我在什么事件中使用tableadapter更新方法。。。其他人使用RowEditEnding事件并说他们让它工作了,但我一辈子都不知道该怎么做。

答案是将.update方法移动到datagrid的SelectionChanged事件。请参阅上面的评论。

我将更新移动到datagrid的SelectionChanged事件,效果良好。此时,数据集中已更新了对datagrid的更改,.update方法随后将这些更改传递到数据库。我还向Window_Closing方法添加了相同的代码,以便在使用离开程序之前,它将在最后一分钟更新任何更改。
<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>
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...");

            }

        }
    }
}