C# 行编辑结束和数据网格更新

C# 行编辑结束和数据网格更新,c#,wpf,datagrid,C#,Wpf,Datagrid,我有WPF数据网格;当我使用RowEditEnding事件更新数据库时,它无法正常工作。 1.我在分配ID的代码中输入新的值,当我返回网格时,我看不到我的ID,只看到我键入的值。(如果关闭应用程序,数据将丢失) 2.当我再次双击datagrid并保留行中的所有内容时,数据将更新并保存在DB中 我用的方法对吗 以下是代码: <Window.Resources> <local:ManageOrdersDataSet x:Key="manageOrdersDa

我有WPF数据网格;当我使用RowEditEnding事件更新数据库时,它无法正常工作。 1.我在分配ID的代码中输入新的值,当我返回网格时,我看不到我的ID,只看到我键入的值。(如果关闭应用程序,数据将丢失) 2.当我再次双击datagrid并保留行中的所有内容时,数据将更新并保存在DB中

我用的方法对吗

以下是代码:

    <Window.Resources>
        <local:ManageOrdersDataSet x:Key="manageOrdersDataSet"/>
        <CollectionViewSource x:Key="customerViewSource" Source="{Binding Customer, Source={StaticResource manageOrdersDataSet}}"/>
    </Window.Resources>

<Grid DataContext="{StaticResource customerViewSource}">

                    <DataGrid x:Name="customerDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="0,0,-0.2,0.4" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False" RowEditEnding="customerDataGrid_RowEditEnding">
                        <DataGrid.Columns>
                            <DataGridTextColumn x:Name="iDColumn" Width="10" Header="ID" Binding="{Binding ID,  Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                            <DataGridTextColumn x:Name="nameColumn" Width="*" Header="Name" Binding="{Binding Name, Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                            <DataGridTextColumn x:Name="addressColumn" Width="*" Header="Address" Binding="{Binding Address,  Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
我找到了解决办法。 我无法很好地解释它,但显然,当eventRowEditEnding新数据行被认为没有值或没有更改时。 所以我决定调用事件处理程序

以下是步骤

  • 将事件处理程序添加到已加载的Windows\u

    manageOrdersDataSet.Customer.RowChanged+=新的DataRowChangeEventHandler(行\u已更改); manageOrdersDataSet.Customer.RowDeleted+=新的DataRowChangeEventHandler(行\u已更改)

  • 实现事件处理程序

    公共无效行\u已更改(对象发送方、DataRowChangeEventArgs e) {

    }

  • OrderManager.ManageOrdersDataSet manageOrdersDataSet;
            OrderManager.ManageOrdersDataSetTableAdapters.CustomerTableAdapter manageOrdersDataSetCustomerTableAdapter;
            System.Windows.Data.CollectionViewSource customerViewSource;
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
    
                manageOrdersDataSet = ((OrderManager.ManageOrdersDataSet)(this.FindResource("manageOrdersDataSet")));
                // Load data into the table Customer. You can modify this code as needed.
                 manageOrdersDataSetCustomerTableAdapter = new OrderManager.ManageOrdersDataSetTableAdapters.CustomerTableAdapter();
                manageOrdersDataSetCustomerTableAdapter.Fill(manageOrdersDataSet.Customer);
                customerViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("customerViewSource")));
                customerViewSource.View.MoveCurrentToFirst();
    
            }
     private void customerDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
            {
     if (rowView != null)
                {
    
                    ManageOrdersDataSet.CustomerRow row = rowView.Row as ManageOrdersDataSet.CustomerRow;
    
                    if (row.IsNull("Name"))
                    {
                        row["Name"] = "Defailt";
                    }
                    if (row.IsNull("Address"))
                    {
                        row["Address"] = "Address Def";
                    }
                    if (row.IsNull("ID"))
                    {
                        row["ID"] = Guid.NewGuid();
                    }
       this.manageOrdersDataSetCustomerTableAdapter.Update(row);
                }
               }
    
        try
        {
            this.manageOrdersDataSetCustomerTableAdapter.Update(manageOrdersDataSet.Customer);
        }
        catch
        {
            // do something
        }