我有一个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集合中的记录与表中的记录进行比较,只更新那些实际不同的记录吗?
有什么建议吗?
答案 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);
}