3

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

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

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

而且:

调用此方法时不会引发 ModeChanged 和 ModeChanging 事件

ModeChangedModeChanging事件页面中,它说它们发生了:

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

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

您能向我解释一下:ModeChanged/ing 事件何时引发?

而且,有没有办法强制引发这些事件?

4

2 回答 2

2

我想我现在知道为什么了。我在其他论坛找到了答案,虽然我没有找到 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;
}
于 2013-08-29T08:41:34.540 回答
0

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

[更新] 我明白你的意思。如果事件没有被提出,你怎么能消费这些事件。

我猜测一下,他们最初不会因为无所事事而被提升,只是执行模式的更改。

在这两种情况下,我猜这更多的是状态变化而不是事件的引发。

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

于 2013-08-28T13:20:26.887 回答