0

默认情况下,在 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()但这会将所有更改保存在屏幕上,并且还会显示上述弹出窗口,并且不是良好的用户体验。

4

1 回答 1

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 转换了它,所以它可能不是替代品。特别是我认为消息框的处理方式有所不同,因此请仔细检查。

于 2013-11-08T13:44:35.320 回答