如何确定ObservableCollection <t>中的行是否实际更改</t>

时间:2012-10-03 14:37:45

标签: c# wpf observablecollection

我有一个ObservableCollection

private static CertOrigin_Entities db = new CertOrigin_Entities(); private static ObservableCollection ocSHIPPING_DTL;

我有一个WPF数据网格,我在

上做后期绑定
    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 - 更新触发器,更新不同的表并将last_used_tarrif字段设置为等于用户更改的值。

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分: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()时进行比较。

答案 1 :(得分: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);
}