Datagridview并发冲突

时间:2011-10-31 17:26:20

标签: c# winforms datagridview

您好我在验证时使用以下代码更新DGV:

        private void propertyInformationDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {

        if (propertyInformationDataGridView.IsCurrentCellDirty && e.ColumnIndex.ToString() != "3")
        {
            propertyInformationTableAdapter.Update((newCityCollectionDataSet)propertyInformationBindingSource.DataSource);
        }
    }

此代码用于更新DGV并将值传递给某些表:

private void propertyInformationDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
     if (e.ColumnIndex.ToString() == "3")
        {
            DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)propertyInformationDataGridView.Rows[e.RowIndex].Cells[3];


            DataGridViewRow row = propertyInformationDataGridView.Rows[e.RowIndex] as DataGridViewRow;

            System.Data.DataRowView SelectedRowView;
            newCityCollectionDataSet.PropertyInformationRow SelectedRow;

            SelectedRowView = (System.Data.DataRowView)propertyInformationBindingSource.Current;
            SelectedRow = (newCityCollectionDataSet.PropertyInformationRow)SelectedRowView.Row;

            if (Convert.ToBoolean(checkCell.Value) == false && propertyInformationDataGridView.IsCurrentCellDirty)
            {
                DataClasses1DataContext dc = new DataClasses1DataContext();

                var matchedCaseNumber = (from c in dc.GetTable<PropertyInformation>()
                                         where c.CaseNumberKey == SelectedRow.CaseNumberKey
                                         select c).SingleOrDefault();
                DateTime saveNow = DateTime.Now;

                reportsSent newReport = new reportsSent();
                newReport.CaseNumberKey = SelectedRow.CaseNumberKey;
                dc.reportsSents.InsertOnSubmit(newReport);
                matchedCaseNumber.DateFinished = saveNow;
                dc.SubmitChanges();

            }


        }
    }

当我点击完成值或单元格值3然后在不同的记录上单击不同的单元格例如单元格值0时会发生错误。我理解为什么我会收到错误,但我该如何防止这种情况呢?我应该将代码从验证移动到单击以便不会发生错误或是否有其他方法来处理此问题?发生错误的原因是因为我正在使用此更新:dc.SubmitChanges();然后在此处再次更新:

if (propertyInformationDataGridView.IsCurrentCellDirty && e.ColumnIndex.ToString() != "3")
        {
            propertyInformationTableAdapter.Update((newCityCollectionDataSet)propertyInformationBindingSource.DataSource);
        }

我不确定在案例结束后如何强制更新正确的数据集。

错误是:

并发冲突:UpdateCommand影响了预期的1条记录中的0条。

在设计师中它出现在这里:

 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
    public virtual int Update(newCityCollectionDataSet dataSet) {
        return this.Adapter.Update(dataSet, "PropertyInformation");

谢谢,

1 个答案:

答案 0 :(得分:0)

为什么要将强类型数据集和LINQ to SQL结合起来?正如您可能已经猜到的那样,他们正在尝试更新相同的数据,因此第二个框架会受到ConcurrencyViolation的攻击。<​​/ p>