在ASP.NET窗体视图上,何时引发ModeChanged和ModeChanging事件

本文关键字:ModeChanged ModeChanging 事件 何时引 NET ASP 窗体 视图 | 更新日期: 2023-09-27 18:29:14

当我试图找出为什么在调用formview的ChangeMode事件时没有调用OnModeChanging处理程序时,会弹出此消息。

在formview的ChangeMode方法MSDN页面上,声明它:

将FormView控件切换到指定的数据输入模式

而且:

当该方法被称为时,不会引发ModeChanged和ModeChanging事件

ModeChangedModeChanging事件页面中,显示它们发生:

当FormView控件在编辑、插入和只读模式之间切换时

分别在模式改变之后/之前。

你能向我解释一下吗:ModeChanged/ing事件是什么时候引发的?

还有,有没有办法强迫人们提起这些事件?

在ASP.NET窗体视图上,何时引发ModeChanged和ModeChanging事件

我想我现在知道为什么了。我在其他论坛上找到了答案,虽然我没有找到FormView的代码,但我找到了DetailsView的实现,我认为在这种情况下可能是类似的。

基本上,我所理解的是,当单击命令按钮(取消、编辑、插入、新建和更新)时,即当不能直接控制这些事件时,会引发ModeChanged/ing事件,当我们使用ChangeMode方法时,我们知道模式已经改变(或将要改变),而引发事件毫无意义。。

细节视图更改模式:

public void ChangeMode(DetailsViewMode newMode) {
    Mode = newMode;
}

DetailsView命令处理程序:

private void HandleCancel() {
    bool isBoundToDataSourceControl = IsBoundUsingDataSourceID;
    DetailsViewModeEventArgs e = new DetailsViewModeEventArgs(DefaultMode, true);
    OnModeChanging(e);
    if (e.Cancel) {
        return;
    }
    if (isBoundToDataSourceControl) {
        Mode = e.NewMode;
        OnModeChanged(EventArgs.Empty);
    }
    RequiresDataBinding = true;
}

private void HandleEdit() {
    if (PageIndex < 0) {
        return;
    }
    DetailsViewModeEventArgs e = new DetailsViewModeEventArgs(DetailsViewMode.Edit, false);
    OnModeChanging(e);
    if (e.Cancel) {
        return;
    }
    if (IsBoundUsingDataSourceID) {
        Mode = e.NewMode;
        OnModeChanged(EventArgs.Empty);
    }
    RequiresDataBinding = true;
}
private bool HandleInsertCallback(int affectedRows, Exception ex) {
    DetailsViewInsertedEventArgs dea = new DetailsViewInsertedEventArgs(affectedRows, ex);
    dea.SetValues(_insertValues);
    OnItemInserted(dea);
    _insertValues = null;
    if (ex != null && !dea.ExceptionHandled) {
        if (PageIsValidAfterModelException()) {
            return false;
        }
        dea.KeepInInsertMode = true;
    }
    if (!dea.KeepInInsertMode) {
        DetailsViewModeEventArgs eMode = new DetailsViewModeEventArgs(DefaultMode, false);
        OnModeChanging(eMode);
        if (!eMode.Cancel) {
            Mode = eMode.NewMode;
            OnModeChanged(EventArgs.Empty);
            RequiresDataBinding = true;
        }
    }
    return true;
}
private void HandleNew() {
    DetailsViewModeEventArgs e = new DetailsViewModeEventArgs(DetailsViewMode.Insert, false);
    OnModeChanging(e);
    if (e.Cancel) {
        return;
    }
    if (IsBoundUsingDataSourceID) {
        Mode = e.NewMode;
        OnModeChanged(EventArgs.Empty);
    }
    RequiresDataBinding = true;
}

private bool HandleUpdateCallback(int affectedRows, Exception ex) {
    DetailsViewUpdatedEventArgs dea = new DetailsViewUpdatedEventArgs(affectedRows, ex);
    dea.SetOldValues(_updateOldValues);
    dea.SetNewValues(_updateNewValues);
    dea.SetKeys(_updateKeys);
    OnItemUpdated(dea);
    _updateKeys = null;
    _updateOldValues = null;
    _updateNewValues = null;
    if (ex != null && !dea.ExceptionHandled) {
        if (PageIsValidAfterModelException()) {
            return false;
        }
        dea.KeepInEditMode = true;
    }
    if (!dea.KeepInEditMode) {
        DetailsViewModeEventArgs eMode = new DetailsViewModeEventArgs(DefaultMode, false);
        OnModeChanging(eMode);
        if (!eMode.Cancel) {
            Mode = eMode.NewMode;
            OnModeChanged(EventArgs.Empty);
            RequiresDataBinding = true;
        }
    }
    return true;
}

使用ChangeMode,您可以选择控制切换到其模式之一。当它开始执行此任务时,会引发ModeChanging事件(表示它正在进行中)(可选地在此处执行某些操作)。一旦该任务完成,它就会引发ModeChanged事件(表示它已经完成)(可选地在此处执行某些操作)。

[更新]我明白你的意思。如果这些活动没有得到提升,你怎么能消费呢。

我想,他们最初并不是因为无所事事而被提升的,只是执行模式的改变。

我想,无论哪种情况,这都更像是一种状态的改变,而不是事件的引发。

[更新]我认为我们都在说,如果没有人订阅该事件(即,没有人在听它),那么就没有必要提出它。