【问题标题】:On ASP.NET formview when are the ModeChanged and ModeChanging events raised?在 ASP.NET formview 上,何时引发 ModeChanged 和 ModeChanging 事件?
【发布时间】:2013-08-28 10:19:06
【问题描述】:

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

在formview的ChangeMode方法MSDNpage 上是这样写的:

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

还有:

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

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net .net formview


    【解决方案1】:

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

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

    DetailsView 更改模式:

    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;
    }
    

    【讨论】:

    • 请注意,在插入时,ModeChange 发生在 Inserted 事件之后。如果在此事件中设置 KeepInInsertMode = true,则将跳过 ModeChange。更新具有相同的模式。
    • 很好的答案,除了'引发事件没有任何意义'。不引发事件是非常不一致的行为,真可惜。
    【解决方案2】:

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

    [更新] 我明白你的意思了。如果事件不被引发,你怎么能消费它们。

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

    我猜无论哪种情况,这更像是一种状态变化,而不是引发事件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多