默认情况下,在Lightswitch中,如果要从屏幕列表或DataGrid中删除项目,可以单击默认提供的删除按钮,也可以通过调用“屏幕代码”以编程方式从VisualCollection中删除该项目。
this.VisualCollection<Entity>.SelectedItem.Delete()
或
this.VisualCollection<Entity>.DeleteSelcted()
但是,这标记了所选的行/实体以进行删除,并在DataGrid / List的最左侧列中放置一个“X”。该行对用户仍然可见,虽然这确实反映了该进程的事务/异步性质,但是对于期望从列表中删除该行的用户来说,这会让人感到困惑。例如:
客户:我删除了为什么它仍然存在...
我:你注意到左边的x了吗?
顾客:哦....嗯......
我:是的...您需要单击“保存”以将更改保留到数据库中。
客户:......我会假装这样有意义。
我:......那是个好孩子......
更好的方法是在调用delete时从VisualCollection中删除该项,然后静默保持更改。由于异步性质,没有恼人的等待/加载弹出窗口。
我尝试过调用this.VisualCollection<Entity>.RemoveSelected()
,但会产生LightSwitchException - Current item cannot be removed
我在调用Delete()
后尝试保存记录但是会在屏幕上保存所有更改,并且还显示上述弹出窗口并且不是一个良好的用户体验。
答案 0 :(得分:0)
在以编程方式对DataGrid进行任何更改后,我调用了我编写的这个函数。它将检查是否存在任何验证错误,并告知用户它们是否存在以便纠正它们。否则,它将默默地在后台保持更改。我不确定“等待/加载弹出窗口”是什么意思。唯一的指示是选项卡上屏幕名称旁边的小蓝色微调器一两秒钟。
private void ValidateAndSave()
{
//Check for validation errors
if ((this.Details.ValidationResults.HasErrors == false)) {
//Save the changes to the database
try {
this.DataWorkspace.DatabaseNameData.SaveChanges();
} catch (Exception ex) {
this.ShowMessageBox(ex.ToString());
}
} else {
//If validation errors exist,
string res = "";
//Add each one to a string,
foreach (object msg_loopVariable in this.Details.ValidationResults) {
msg = msg_loopVariable;
res = res + msg.Property.DisplayName + ": " + msg.Message + "\r\n";
}
//And display them in a message box
this.ShowMessageBox(res, "Validation error", MessageBoxOption.Ok);
}
}
注意:我从VB.NET转换了这个,所以它可能不是替代品。特别是我认为消息框的完成方式不同,所以请仔细检查。