2

ObservableCollection があります

プライベート静的 CertOrigin_Entities db = 新しい 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サーバーデータベースを更新しています

    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 フィールドを設定する On Update トリガー。

ユーザーが実際にデータを変更していない場合、上記のいずれも実行されません。レコードが実際に変更されたかどうかを確認する方法はありますか?

監視可能なコレクション内のレコードをテーブル内のレコードと比較して、実際に異なるレコードのみを更新できますか?

何かアドバイス?

4

2 に答える 2

1

UpdateSourceTrigger を PropertyChanged に設定しているため ( MSDN: Binding.UpdateSourceTriggerを参照してください)、変更を検出するたびに変更を実行します。

5864.193.45 から 5864.193.46 への変更は 1 つのアクションであり、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 に答える