我在Silverlight 4中使用DataForm。实际上,有几个DataForms,它们共享一个共同的RIA Services上下文。这是我遇到的问题......
如果我开始在其中一个DataForms中编辑DataField,然后单击一个调用Context.SubmitChanges()的按钮,我收到以下错误:
�Entity 'foo' is currently being edited and has uncommitted changes.
A call to BeginEdit must be followed by a call to EndEdit or CancelEdit
before changes can be submitted.�
请注意,“提交更改”按钮位于DataForms的外部,并应用于DataForms之间共享的RIA Services上下文(每个DataForms位于选项卡控件的单独选项卡中)。
我希望能够通过在代码中检测DataForm何时处于编辑模式来避免此问题。当我处于调试模式时,我可以看到DataForm具有IsEditing
和CanCancelEdit
等属性,表明它处于编辑模式,但这些属性似乎不可用于我的代码。
有什么想法吗?
答案 0 :(得分:3)
您可以在调用DomainContext.SubmitChanges()之前调用DataForm.CommitEdit()并完全避免错误。
答案 1 :(得分:3)
我在调用SubmitChanges()之前在我的数据网格上使用了CommitEdit方法(在DataForm上应该是相同的),以便用一行代码修复问题。
myDataGrid.CommitEdit(DataGridEditingUnit.Row, true);
答案 2 :(得分:1)
我不确定IsEditing
和CanCancelEdit
是什么,但没有记录。
但是Mode
属性DataFormMode
枚举,ReadOnly
,Edit
和AddNew
。还有一个IsItemChanged
属性,指示是否已进行任何实际更改。
答案 3 :(得分:0)
由于没有可用的属性提供了我需要的信息,我最终创建了自己的私有字段(在包含DataForm的UserControl中),名为_isEditing
,初始化为“false”。在DataForm.BeginningEdit
事件处理程序中,我将其设置为“true”,并在DataForm.EditEnded
事件处理程序中将其设置为“false”。然后,我创建了一个名为IsEditing
的只读公共属性,以使值在外部可用。
答案 4 :(得分:0)
我刚刚用这段代码来解决我遇到的问题。当单击“保存”按钮时,它位于我的代码隐藏中:
bool editresult = true;
this.FindChildrenByType<DataGrid>().ToList().ForEach(grid =>
{
editresult = editresult && grid.CommitEdit(DataGridEditingUnit.Row, true) && grid.IsValid;
});
if (!editresult)
{
_messager.Alert("There is a problem with one of the items shown on the screen. This will usually be highlighted in red.\r\nPlease correct the item(s) and try saving again.");
}
else
{
// Save changes
}
DataGrid.CommitEdit(DataGridEditingUnit.Row,true)告诉datagrid提交行,最后一个boolean告诉网格退出编辑模式。这将返回true或false,具体取决于该行是否应该退出编辑模式。通常在您正在编辑行的网格中存在验证错误,网格将不允许您通过单击另一个项目退出编辑模式,但此调用将允许退出但返回false。 DataGrid.IsValid检查网格中的所有项目以查看它们是否有效。