Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net DetailsView:如何在新命令上使用CommandArgument设置HiddenField值?_Asp.net_Detailsview - Fatal编程技术网

Asp.net DetailsView:如何在新命令上使用CommandArgument设置HiddenField值?

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

我继承了一些代码,这些代码在Web部件控件中具有GridView和DetailsView

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

有一个下拉列表,按对象类型过滤GridView,DetailsView有一个自动生成的插入按钮

<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

单步执行代码时,出现以下情况:

  • 按下链接按钮后,将触发OnItemCommand。CommandName=“New”在这里,我可以检索CommandArgument
  • 触发下一个OnModeChanging。e、 NewMode=“插入”。从我看到的所有示例中,这里您在DetailsView上调用ChangeMode,然后在其上调用Databind()
  • 调用Databind()的结果将触发Next OnDataBound
  • 我没有找到在各种事件之间保留隐藏变量值的方法,因此我最终使用了会话变量。下面是代码,以防有人需要

    ASCX中的详细视图声明:

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