Asp.net DetailsView:如何在新命令上使用CommandArgument设置HiddenField值?
我继承了一些代码,这些代码在Web部件控件中具有GridView和DetailsView DetailsView能够创建两种不同类型的对象,例如TypeA和TypeB 有一个下拉列表,按对象类型过滤GridView,DetailsView有一个自动生成的插入按钮Asp.net DetailsView:如何在新命令上使用CommandArgument设置HiddenField值?,asp.net,detailsview,Asp.net,Detailsview,我继承了一些代码,这些代码在Web部件控件中具有GridView和DetailsView DetailsView能够创建两种不同类型的对象,例如TypeA和TypeB 有一个下拉列表,按对象类型过滤GridView,DetailsView有一个自动生成的插入按钮 <asp:DetailsView ID="myDetailsView" AutoGenerateInsertButton="True" AutoGenerateEditButton="True" Au
<asp:DetailsView ID="myDetailsView"
AutoGenerateInsertButton="True"
AutoGenerateEditButton="True"
AutoGenerateRows="false"
OnItemUpdating="OnItemUpdating"
DefaultMode="ReadOnly"
OnDataBound="OnDetailsViewBound"
OnItemInserting="OnItemInserting"
OnModeChanging="OnDetailsViewModeChanging"
runat="server">
我发现我不需要在这个方法中设置模式(this.myDetailsView.ChangeMode(DetailsViewMode.Insert);
),因为OnDetailsViewModeChanging事件处理程序仍然被触发。
这将查找控件并正确设置控件上的值。如果我再次检查OnDetailsViewModeChanging中的值,它们的值仍会设置,但作为此方法中逻辑的一部分,会调用
this.myDetailsView.DataBind()
这将导致回发,此时,值将丢失。我试着加上
EnableViewState="True"
但这没什么区别。我已经回顾了页面生命周期(http://spazzarama.files.wordpress.com/2009/02/aspnet_page-control-life-cycle.pdf)我想也许this.ensureChildControl()
会有帮助,但也没什么区别
另一种方法是将值存储在会话中,但我不希望如此。据我所知,除了捕获所有命令的
OnItemCommand
之外,没有捕获“New”命令的事件。(注意:您需要确保在链接按钮上设置了CausesValidation=“False”
,否则代码不会进入OnItemCommand
)
单步执行代码时,出现以下情况:
<asp:DetailsView ID="myDetailsView"
AutoGenerateInsertButton="False"
AutoGenerateEditButton="True"
AutoGenerateRows="false"
OnItemInserting="OnItemInserting"
OnItemUpdating="OnItemUpdating"
OnItemCommand="OnItemCommand"
DefaultMode="ReadOnly"
OnDataBound="OnDetailsViewBound"
OnModeChanging="OnDetailsViewModeChanging"
runat="server">
OnItemCommand事件处理程序
protected void OnItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName.Equals("New", StringComparison.InvariantCultureIgnoreCase))
{
var objectType = e.CommandArgument.ToString();
HiddenField typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
HttpContext.Current.Session[SESSIONKEY_MYVALUE] = objectType;
}
}
protected void OnDetailsViewBound(object sender, EventArgs e)
{
if (this.myDetailsView.CurrentMode == DetailsViewMode.Insert)
{
var sessionVar = HttpContext.Current.Session[SESSIONKEY_MYVALUE];
var objectType = sessionVar == null ?
DEFAULT_OBJECTTYPE :
sessionVar.ToString();
var typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
}
}
OnModeChanging事件处理程序
protected void OnDetailsViewModeChanging(Object sender, DetailsViewModeEventArgs e)
{
if (e.NewMode == DetailsViewMode.Insert)
{
this.myDetailsView.ChangeMode(DetailsViewMode.Insert);
this.myDetailsView.DataBind();
}
}
OnDataBound事件处理程序
protected void OnItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName.Equals("New", StringComparison.InvariantCultureIgnoreCase))
{
var objectType = e.CommandArgument.ToString();
HiddenField typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
HttpContext.Current.Session[SESSIONKEY_MYVALUE] = objectType;
}
}
protected void OnDetailsViewBound(object sender, EventArgs e)
{
if (this.myDetailsView.CurrentMode == DetailsViewMode.Insert)
{
var sessionVar = HttpContext.Current.Session[SESSIONKEY_MYVALUE];
var objectType = sessionVar == null ?
DEFAULT_OBJECTTYPE :
sessionVar.ToString();
var typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
}
}
protected void OnItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName.Equals("New", StringComparison.InvariantCultureIgnoreCase))
{
var objectType = e.CommandArgument.ToString();
HiddenField typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
HttpContext.Current.Session[SESSIONKEY_MYVALUE] = objectType;
}
}
protected void OnDetailsViewModeChanging(Object sender, DetailsViewModeEventArgs e)
{
if (e.NewMode == DetailsViewMode.Insert)
{
this.myDetailsView.ChangeMode(DetailsViewMode.Insert);
this.myDetailsView.DataBind();
}
}
protected void OnDetailsViewBound(object sender, EventArgs e)
{
if (this.myDetailsView.CurrentMode == DetailsViewMode.Insert)
{
var sessionVar = HttpContext.Current.Session[SESSIONKEY_MYVALUE];
var objectType = sessionVar == null ?
DEFAULT_OBJECTTYPE :
sessionVar.ToString();
var typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
}
}