首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DetailsView:如何使用HiddenField命令上的CommandArgument设置CommandArgument值?

DetailsView:如何使用HiddenField命令上的CommandArgument设置CommandArgument值?
EN

Stack Overflow用户
提问于 2012-11-07 22:36:31
回答 1查看 1.6K关注 0票数 1

我继承了一些在webpart控件中具有GridView和DetailsView的代码。

DetailsView能够创建两种不同类型的对象,例如TypeA和TypeB。

有一个下拉列表,根据对象类型过滤GridView,DetailsView有一个自动生成的Insert按钮。

代码语言:javascript
复制
<asp:DetailsView ID="myDetailsView"  
    AutoGenerateInsertButton="True"
    AutoGenerateEditButton="True" 
    AutoGenerateRows="false" 
    OnItemUpdating="OnItemUpdating"
    DefaultMode="ReadOnly" 
    OnDataBound="OnDetailsViewBound"
    OnItemInserting="OnItemInserting" 
    OnModeChanging="OnDetailsViewModeChanging"        
    runat="server">

我被要求:

  1. 删除GridView上的过滤器;以及
  2. 将New按钮/链接拆分为两个,这样就有一个单独的按钮来创建每种类型的对象。

删除过滤器意味着我需要一些其他方法来跟踪我们正在创建的对象类型。我已将新连结分开,将以上更改为:

代码语言:javascript
复制
<asp:DetailsView ID="myDetailsView"  
    AutoGenerateInsertButton="False"
    AutoGenerateEditButton="True" 
    AutoGenerateRows="false" 
    OnItemUpdating="OnItemUpdating"
    DefaultMode="ReadOnly" 
    OnDataBound="OnDetailsViewBound"
    OnItemInserting="OnItemInserting" 
    OnModeChanging="OnDetailsViewModeChanging"        
    runat="server">

加上

代码语言:javascript
复制
 <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中:

代码语言:javascript
复制
<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>

在代码后面:

代码语言:javascript
复制
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中再次检查这些值,它们的值仍然会被设置,但是作为此方法中逻辑的一部分,会调用

代码语言:javascript
复制
this.myDetailsView.DataBind()

这将导致回发,此时,值将丢失。我试着添加

代码语言:javascript
复制
EnableViewState="True"

但这没什么区别。我回顾了页面生命周期(page-control-life-cycle.pdf),并认为this.EnsureChildControls()可能会有所帮助,但也没有什么不同。

另一种选择是在会话中存储值,但我宁愿不存储。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-05 05:09:30

据我所知,除了捕获所有命令的OnItemCommand之外,没有捕获"New“命令的事件。(注意:您需要确保在您的CausesValidation="False"上设置了LinkButton,否则代码不会进入OnItemCommand)。

在逐步执行代码时,发生了以下情况:

  1. 按下链接按钮后,就会触发OnItemCommand。CommandName = "New“,在这里我可以检索CommandArgument
  2. 下一个OnModeChanging被触发。e.NewMode =“插入”。从我见过的所有示例中,您可以在ChangeMode上调用DetailsView,然后在它上调用Databind()
  3. 下一个OnDataBound是由于调用Databind()而触发的

我没有找到在不同事件之间保留隐藏变量的值的方法,所以我最终使用了一个会话变量。代码在下面,以防有人想要。

ASCX中的DetailsView声明:

代码语言:javascript
复制
    <asp:DetailsView ID="myDetailsView"  
        AutoGenerateInsertButton="False"
        AutoGenerateEditButton="True" 
        AutoGenerateRows="false" 
        OnItemInserting="OnItemInserting" 
        OnItemUpdating="OnItemUpdating"
        OnItemCommand="OnItemCommand"
        DefaultMode="ReadOnly" 
        OnDataBound="OnDetailsViewBound"
        OnModeChanging="OnDetailsViewModeChanging"        
        runat="server">

在代码隐藏中:

不断的声明..。

代码语言:javascript
复制
    private const string SESSIONKEY_MYVALUE = "MyValue";
    private const string DEFAULT_OBJECTTYPE = "TypeA";

OnItemCommand事件处理程序。

代码语言:javascript
复制
    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事件处理程序。

代码语言:javascript
复制
    protected void OnDetailsViewModeChanging(Object sender, DetailsViewModeEventArgs e)
    {
        if (e.NewMode == DetailsViewMode.Insert)
        {
            this.myDetailsView.ChangeMode(DetailsViewMode.Insert);
            this.myDetailsView.DataBind();
        }
    }

OnDataBound事件处理程序。

代码语言:javascript
复制
    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;
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13279469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档