在ASP.NET窗体视图上,何时引发ModeChanged和ModeChanging事件
本文关键字:ModeChanged ModeChanging 事件 何时引 NET ASP 窗体 视图 | 更新日期: 2023-09-27 18:29:14
当我试图找出为什么在调用formview的ChangeMode事件时没有调用OnModeChanging
处理程序时,会弹出此消息。
在formview的ChangeMode
方法MSDN页面上,声明它:
将FormView控件切换到指定的数据输入模式
而且:
当该方法被称为时,不会引发ModeChanged和ModeChanging事件
在ModeChanged
和ModeChanging
事件页面中,显示它们发生:
当FormView控件在编辑、插入和只读模式之间切换时
分别在模式改变之后/之前。
你能向我解释一下吗:ModeChanged/ing事件是什么时候引发的?
还有,有没有办法强迫人们提起这些事件?
我想我现在知道为什么了。我在其他论坛上找到了答案,虽然我没有找到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事件(表示它已经完成)(可选地在此处执行某些操作)。
[更新]我明白你的意思。如果这些活动没有得到提升,你怎么能消费呢。
我想,他们最初并不是因为无所事事而被提升的,只是执行模式的改变。
我想,无论哪种情况,这都更像是一种状态的改变,而不是事件的引发。
[更新]我认为我们都在说,如果没有人订阅该事件(即,没有人在听它),那么就没有必要提出它。