通过WPF中的datagrid更新SQL表 - 我无法从DataGrid中获取更新的数据



我有一个小程序,用于检查进出。

DB在SQL Azure中

问题在于,当我整个过程中编辑数据杂志和选项卡以激活roweditending时,抓取的数据似乎是我的旧数据,而不是我的新数据。这只是最奇怪的事情。

这是我的XAML:

<Window x:Class="CreditCardTracker.CheckIn"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CreditCardTracker"
    xmlns:dblocal ="clr-namespace:CreditCardTracker.dbml"
    mc:Ignorable="d"
    Title="Check In" Height="378.534" Width="707.978">

<Grid>
    <DataGrid x:Name="dg_cct" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="297" Width="683" AutoGenerateColumns="False" RowEditEnding="dg_cct_RowEditEnding" Loaded="dg_cct_Loaded">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Id}" Header="ID" IsReadOnly="True"/>
            <DataGridTextColumn Binding="{Binding CCT_PersonBorrowing}" Header="Borrower" />
            <DataGridTextColumn Binding="{Binding CCT_CardType}" Header="Card Type" />
            <DataGridTemplateColumn Header="Check Out">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding CCT_CheckOutDateTime}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding CCT_Vendor}" Header="Vendor" />
            <DataGridTextColumn Binding="{Binding CCT_Amount}" Header="Amount" />
            <DataGridTemplateColumn Header="Check In">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding CCT_CheckInDateTime}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

这是代码:

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Data.Linq;
namespace CreditCardTracker
{
/// <summary>
/// Interaction logic for CheckIn.xaml
/// </summary>
public partial class CheckIn : Window
{
    public CheckIn()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(dg_cct_Loaded);
    }
    public void LoadTable()
    {
        dbml.creditCardTableDataContext dc = new dbml.creditCardTableDataContext();
        var q = from p in dc.CreditCardTrackers
                where p.CCT_CheckInDateTime == null
                select p;
        dg_cct.ItemsSource = q.ToList();
    }

    private void dg_cct_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit)
        {
                dbml.creditCardTableDataContext context = new dbml.creditCardTableDataContext();
                dbml.CreditCardTracker borrowerRow = e.Row.DataContext as dbml.CreditCardTracker;
                int m = borrowerRow.Id;
                //MessageBox.Show(m.ToString());    
                var borrower = (from p in context.GetTable<dbml.CreditCardTracker>()
                                where p.Id == m
                                select p).SingleOrDefault();

                MessageBox.Show("Amount is " + borrowerRow.Id);
                borrower.CCT_Amount = borrowerRow.CCT_Amount;
                borrower.CCT_CardType = borrowerRow.CCT_CardType;
                borrower.CCT_CheckInDateTime = borrowerRow.CCT_CheckInDateTime;
                borrower.CCT_CheckOutDateTime = borrowerRow.CCT_CheckOutDateTime;
                borrower.CCT_PersonBorrowing = borrowerRow.CCT_PersonBorrowing;
                borrower.CCT_Vendor = borrowerRow.CCT_Vendor;
                context.SubmitChanges();
                MessageBox.Show("Updated successfully.");
                LoadTable();
        }
    }
    private void dg_cct_Loaded(object sender, RoutedEventArgs e)
    {
        dbml.creditCardTableDataContext dc = new dbml.creditCardTableDataContext();
        var q = from p in dc.CreditCardTrackers
                where p.CCT_CheckInDateTime == null
                select p;
        dg_cct.ItemsSource = q.ToList();
    }
}
}

这一点代码:

dbml.CreditCardTracker borrowerRow = e.Row.DataContext as dbml.CreditCardTracker;

应该给我更新的号码(我输入到数据杂志的号码(,但它给了我旧的数字。运行时,我可以在消息框中看到它:

MessageBox.Show("Amount is " + borrowerRow.Id);

真的很奇怪。我经过了多个教程,但似乎没有任何作用。任何帮助都会很棒。

谢谢。

ahh ..我发现了它。

我从此链接找到了它:

https://social.msdn.microsoft.com/forums/vstudio/en-us/c38fc695-d1ec-4252-4252-87b7b484ee01e4/wpf-4-datagrid-rowed-ramp.

WPF 4中的DataGrid控件与WPFToolKit中的DataGrid有些不同。默认情况下,它在选择行更改后更新数据,因此我们无法在RowedItending事件中获得新值。例如,我们可以通过设置绑定的updateSourCetrigger来解决此问题,例如,我们可以将updateRateSourCetrigger设置为属性交换,以便WEN可以在RowedItending事件中获取新值。

某些内容喜欢以下内容:

<DataGrid AutoGenerateColumns="False" Name="datagrid" ItemsSource="{Binding}" RowEditEnding="datagrid_RowEditEnding">

最新更新