|
你可以温和地处理冲突检测错误,可以通过提示用户下层数据被改变了,向用户显示改变过的值, 让用户选择提交或放弃自己的操作。下面的例子演示处理冲突检测的一种可行方法。请注意,DetailsView的RowUpdated事件参数传递了可用于检测用户输入的值的字典。你还可以设置这个事件参数的KeepInEditMode属性,使用户在决定如何处理冲突期间,DetailsView处于编辑模式。这个例子所试验方法与上面一个例子类似,同时打开两个窗口来创建冲突更新。
Protected Sub DetailsView1_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) If e.AffectedRows = 0 Then ' 使DetailsView处于编辑模式并与数据库同步 e.KeepInEditMode = True DetailsView1.DataBind() ' 用用户输入的值重新填充DetailsView Dim t As TextBox t = DetailsView1.Rows(1).Cells(1).Controls(0) t.Text = e.NewValues("OrderDate") t = DetailsView1.Rows(2).Cells(1).Controls(0) t.Text = e.NewValues("ShipCountry")
ErrorPanel.Visible = True Else ErrorPanel.Visible = False End If End Sub
Protected Sub DetailsView1_ModeChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewModeEventArgs) If e.CancelingEdit = True AndAlso ErrorPanel.Visible = True Then ErrorPanel.Visible = False End If End Sub | 使用ObjectDataSource的时候,情况也类似。请注意,由于数据源的ConflictDetection属性被设置为CompareAllValues,数据源将查找一个可接受Contact对象的每个字段的原始值的UpdateContact重载。
你还可以同时使用DataObjectTypeName属性和CompareAllValues。在这种情况下,ObjectDataSource查找仅接受两个参数(都是Contact)的UpdateContact重载。第一个参数是存放新值的Contact对象,第二个参数是存放旧值的Contact对象。
|