我继承了一些在webpart控件中具有GridView和DetailsView的代码。
DetailsView能够创建两种不同类型的对象,例如TypeA和TypeB。
有一个下拉列表,根据对象类型过滤GridView,DetailsView有一个自动生成的Insert按钮。
<asp:DetailsView ID="myDetailsView"
AutoGenerateInsertButton="True"
AutoGenerateEditButton="True"
AutoGenerateRows="false"
OnItemUpdating="OnItemUpdating"
DefaultMode="ReadOnly"
OnDataBound="OnDetailsViewBound"
OnItemInserting="OnItemInserting"
OnModeChanging="OnDetailsViewModeChanging"
runat="server">我被要求:
删除过滤器意味着我需要一些其他方法来跟踪我们正在创建的对象类型。我已将新连结分开,将以上更改为:
<asp:DetailsView ID="myDetailsView"
AutoGenerateInsertButton="False"
AutoGenerateEditButton="True"
AutoGenerateRows="false"
OnItemUpdating="OnItemUpdating"
DefaultMode="ReadOnly"
OnDataBound="OnDetailsViewBound"
OnItemInserting="OnItemInserting"
OnModeChanging="OnDetailsViewModeChanging"
runat="server">加上
<FooterTemplate>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkCreateNewTypeA" CommandName="New" CommandArgument="TypeA" CssClass="buttonlink">New Type A</asp:LinkButton>
<asp:LinkButton runat="server" ID="lnkCreateNewTypeB" CommandName="New" CommandArgument="TypeB" CssClass="buttonlink">New Type B</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</FooterTemplate>我还没有删除过滤器,所以这些更改目前的功能与以前一样,因为我使用的是New命令。我希望能够以某种方式捕获新事件,以便将CommandArgument值放入隐藏字段,然后DetailsView将使用该字段来确定它正在创建的对象类型,并显示/隐藏字段。当我在代码中的所有事件处理程序中放置断点时,第一个中断的是OnDetailsViewModeChanging,它没有访问CommandArgument的权限。
当按下DetailsView中的任何按钮时,都会触发DetailsView(如果是连接的话),并允许我访问CommandArgument,但我不确定在这个方法中到底需要做什么来模拟使用自动生成按钮时发生的事件链。
是检索CommandArgument以在OnItemCommand事件处理程序中捕获它的唯一选项,还是在OnItemCommand命令中触发了其他事件?
有人能向我解释触发New命令时发生的事件序列吗?
我在某个地方读到它改变了插入模式,但我不知道它还能做什么。我相信在单击“插入”链接之前不会调用OnItemInserting方法。
任何帮助都将受到感激!!
编辑:
我在DetailsView事件上找到了这个链接,但它没有回答我的问题。events.aspx
编辑:
我试着添加以下内容:
在ascx中:
<asp:DetailsView ID="myDetailsView"
...
OnItemCommand="OnItemCommand"
...
runat="server">
...
<asp:TemplateField HeaderText="Object Type" HeaderStyle-CssClass="columnHeader">
<ItemTemplate>
<asp:HiddenField runat="server" ID="hidObjectType" Value=""/>
<asp:Label runat="server" ID="lblObjectType"></asp:Label>
</ItemTemplate>
</asp:TemplateField>在代码后面:
protected void OnItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName.Equals("New"))
{
var objectType = e.CommandArgument.ToString();
HiddenField typeHidden = this.myDetailsView.FindControl("hidObjectType") as HiddenField;
if (typeHidden != null)
{
typeHidden.Value = objectType;
}
Label typeLabel = this.myDetailsView.FindControl("lblObjectType") as Label;
if (typeLabel != null)
{
typeLabel.Text = objectType;
}
}
}我发现我不需要在这个方法中设置模式(this.myDetailsView.ChangeMode(DetailsViewMode.Insert);),因为OnDetailsViewModeChanging事件处理程序仍然被触发。这将找到控件并正确设置控件上的值。如果我在OnDetailsViewModeChanging中再次检查这些值,它们的值仍然会被设置,但是作为此方法中逻辑的一部分,会调用
this.myDetailsView.DataBind()这将导致回发,此时,值将丢失。我试着添加
EnableViewState="True"但这没什么区别。我回顾了页面生命周期(page-control-life-cycle.pdf),并认为this.EnsureChildControls()可能会有所帮助,但也没有什么不同。
另一种选择是在会话中存储值,但我宁愿不存储。
发布于 2012-12-05 05:09:30
据我所知,除了捕获所有命令的OnItemCommand之外,没有捕获"New“命令的事件。(注意:您需要确保在您的CausesValidation="False"上设置了LinkButton,否则代码不会进入OnItemCommand)。
在逐步执行代码时,发生了以下情况:
我没有找到在不同事件之间保留隐藏变量的值的方法,所以我最终使用了一个会话变量。代码在下面,以防有人想要。
ASCX中的DetailsView声明:
<asp:DetailsView ID="myDetailsView"
AutoGenerateInsertButton="False"
AutoGenerateEditButton="True"
AutoGenerateRows="false"
OnItemInserting="OnItemInserting"
OnItemUpdating="OnItemUpdating"
OnItemCommand="OnItemCommand"
DefaultMode="ReadOnly"
OnDataBound="OnDetailsViewBound"
OnModeChanging="OnDetailsViewModeChanging"
runat="server">在代码隐藏中:
不断的声明..。
private const string SESSIONKEY_MYVALUE = "MyValue";
private const string DEFAULT_OBJECTTYPE = "TypeA";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;
}
}OnModeChanging事件处理程序。
protected void OnDetailsViewModeChanging(Object sender, DetailsViewModeEventArgs e)
{
if (e.NewMode == DetailsViewMode.Insert)
{
this.myDetailsView.ChangeMode(DetailsViewMode.Insert);
this.myDetailsView.DataBind();
}
}OnDataBound事件处理程序。
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;
}
}
}https://stackoverflow.com/questions/13279469
复制相似问题