2

我有一个 ObservableCollection

私有静态 CertOrigin_Entities db = new CertOrigin_Entities(); 私有静态 ObservableCollection ocSHIPPING_DTL;

我有一个后期绑定的 WPF Datagrid

    private void btn_SEARCH_Click(object sender, RoutedEventArgs e)
    {
        string sCI = this.txt_SEARCH.Text;

        var sd = (db.TBL_SHIPPING.Where(x => x.CommercialInvoiceNumber == sCI)).ToList();
        if (sd.Count() > 0)
        {
            iID = (int)sd[0].SHIPPING_ID;
            var query = (db.v_wpf_cert_origin.Where(x => x.SHIPPING_ID == iID));
            ocSHIPPING_DTL = new ObservableCollection<v_wpf_cert_origin>(query.ToList());

            dgCOO.ItemsSource = ocSHIPPING_DTL;

            var cust = (from x in db.TBL_CUSTOMER
                     join y in db.TBL_REQUISITION on x.CUSTOMER_ID equals y.CUSTOMER_ID
                     join z in db.TBL_SHIPPING on y.REQ_ID equals z.REQ_ID
                     where z.SHIPPING_ID == iID
                     select new {CUST = x.CustomerName}).ToList();
            this.lbl_CUSTOMER.Content = cust[0].CUST.ToString();
        }
    }

我正在更新按钮后面的 SQL Server 数据库并在窗口关闭时

    private static bool _SaveChanges()
    {
        DbTransaction _dbTransaction = null;
        db.Connection.Open();
        using (_dbTransaction = db.Connection.BeginTransaction())
        {
            try
            {
                db.SaveChanges();
                db.AcceptAllChanges();
                _dbTransaction.Commit();
                db.Connection.Close();
            }
            catch (TransactionAbortedException ex)
            {
                db.Connection.Close();
                throw ex;
            }
            return true;
        }
    }

这是发生在我身上的事情......在我的数据网格中,我有一个文本框

                <DataGridTemplateColumn Header="Hs Tarriff Class #:" Width="125" IsReadOnly="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=HsTarriffClassNumber, 
                                UpdateSourceTrigger=PropertyChanged, 
                                NotifyOnTargetUpdated=True}" 
                                     Name="txt_HsTarriffClassNumber" 
                                      />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

如果文本框的值是 5864.193.45 并且我将其更改为 5864.193.46 然后返回 5864.193.45 ObservableCollection 会在记录发生更改时保存记录,但是我不希望它保存记录,因为它没有改变。

变化的主要问题是这个。我桌上有 3 个触发器

1 - 更新后审核触发器将删除并将其插入另一个数据库

2 - 更新后审核触发器向多人发送电子邮件,说明用户更改了数据,他们需要重新打印文件并将其发送给海关

3 - On Update 触发器,更新不同的表并将 last_used_tarrif 字段设置为等于用户更改的值。

如果用户实际上没有更改数据,则上述任何一项都不应触发。有没有办法检查记录是否真的改变了?

我可以将可观察集合中的记录与表中的记录进行比较,并且只更新那些实际上不同的记录吗?

有什么建议吗?

4

2 回答 2

1

因为您将 UpdateSourceTrigger 设置为 PropertyChanged(请参阅MSDN:Binding.UpdateSourceTrigger,每次它检测到更改时,都会执行更改。

从 5864.193.45 更改为 5864.193.46 是一个操作,然后 5864.193.46 更改为 5864.193.45 是另一个操作。

过程 1:您也可以将 UpdateSourceTrigger 更改为 LostFocus ( UpdateSourceTrigger=LostFocus),这样更改才会生效,直到您单击其他位置。这样,当您从 5864.193.45 更改为 5864.193.46 ,然后从 5864.193.46 更改为 5864.193.45 时,在您离开该文本区域之前它不会执行更改。

过程 2:您始终可以实现主 ObservationCollection,然后仅在调用 _SaveChanges() 时进行比较。

于 2012-10-03T14:50:43.207 回答
0

好的,发现了一个有趣的项目

private void dg_VQ_TABLE_VIEW_FocusedRowChanged(object sender, DevExpress.Xpf.Grid.FocusedRowChangedEventArgs e)
{
    int rHANDLE = dg_VQ_TABLE_VIEW.FocusedRowHandle;
    //if (rHANDLE == dg_VQ_DTL_TABLE_VIEW.NewItemRowData.RowHandle.Value) { return; }
    _sync_child(rHANDLE);
}

当我在列表框中选择一个项目时,数据网格的表视图会触发行更改。

所以我添加了一个布尔值,现在问题消失了。

private void lst_REQ_LIST_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (lst_REQ_LIST.SelectedValue == null) { return; }
    _selection_changed();
    bln_CHANGING_REQ = false;
}
private void _selection_changed()
{
    string sGUID = lst_REQ_LIST.SelectedValue.ToString().ToUpper();
    req_guid = new Guid(sGUID);
    quote_guid = new Guid("{00000000-0000-0000-0000-000000000000}");
    bln_CHANGING_REQ = true;
    _load_data();
}

private void dg_VQ_TABLE_VIEW_FocusedRowChanged(object sender, DevExpress.Xpf.Grid.FocusedRowChangedEventArgs e)
{
    if (bln_CHANGING_REQ) { return; }
    int rHANDLE = dg_VQ_TABLE_VIEW.FocusedRowHandle;
    //if (rHANDLE == dg_VQ_DTL_TABLE_VIEW.NewItemRowData.RowHandle.Value) { return; }
    _sync_child(rHANDLE);
}
于 2013-03-13T18:58:52.713 回答