【问题标题】:ASP.NET Gridview: How do I stop a <span></span> within a Gridview from resetting when posting back?ASP.NET Gridview:如何在回发时阻止 Gridview 中的 <span></span> 重置?
【发布时间】:2012-08-22 08:34:42
【问题描述】:

我有一个 Gridview,其中包含一些控件,当用户从 gridview 中进行选择时,这些控件会从服务器更新。

从下拉列表中进行选择后,用户可以在一行的文本框中输入一个百分比,我有一些 javascript,然后执行一些计算并输出到 Gridview 中的项目模板内的跨度。

这一切都有效,但如果用户随后在任何行上进行另一个下拉列表选择,gridview 中的所有跨度都将重置为空白(我尝试过各种控件,包括 asp.net 和 html)。

这一切都在更新面板中。

代码:

 <asp:GridView runat="server" ID="gdvIngredients" AutoGenerateColumns="false" CssClass="table table-stripped"
                        GridLines="None" Visible="false" ShowFooter="true" EnableViewState="true">
                        <Columns>
                            <asp:TemplateField Visible="false">
                                <ItemTemplate>
                                    <asp:Label runat="server" ID="lblId" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Ingredient" ItemStyle-Width="12%">
                                <ItemTemplate>
                                    <asp:DropDownList runat="server" ID="ddlName" AutoPostBack="true" OnSelectedIndexChanged="ddlName_SelectedIndexChanged"
                                        ForeColor="Black" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="%" ItemStyle-Width="6%">
                                <ItemTemplate>
                                    <asp:TextBox runat="server" Text="0" Width="50px" ID="txtPercentage" onkeyup="calculate(this);"
                                        ForeColor="Black" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="kj" ItemStyle-Width="6%">
                                <ItemTemplate>
                                    <asp:Label runat="server" ID="lblKj" CssClass="Kj" Style="display: none;" />
                                    <span runat="server" id="spnKj" class="NewKj">0</span>
                                </ItemTemplate>

【问题讨论】:

    标签: asp.net gridview postback


    【解决方案1】:

    根据您的问题,我了解到您正在使用 javascript 进行计算并将其分配给 span,但是当下次回发发生时,该值不会保留...如果我是对的,我建议您尝试以下步骤.使用 HiddenFields 也可以将值分配为 HiddenFields 在 PostBacks 期间保留值。

    1. 在项目模板中添加隐藏字段

    2. 从 Codebehind(来自 rowdatabound 事件)将“计算”函数设置为文本框,并将当前的 HiddenField 值作为计算(this,'HiddenFieldId')传递给它;

      protected void grd_RowDataBound(object sender,GridViewRowEventArgs e)                   
       {              
                if (e.Row.RowType == DataControlRowType.DataRow)        
                 {            
                    HiddenField hdn = ((HiddenField)e.Row.FindControl("HiddenFieldID"));   
      
                    TextBox txtPercentage = (TextBox)e.Row.FindControl("txtPercentage");
      
                     HtmlGenericControl spnKj=(HtmlGenericControl )e.Row.FindControl("spnKj");
      
                    txtPercentage.Attributes["onClick"]="calculate(this,'"+hdn .ClientID+"');"   
      
                    spnKj.innerHTML=hdn.Value;
                 }
      
       }
      

      Javascript:

    将计算值分配给隐藏字段...

         function calculate(hdnID)
          {
             var CalcValue=//do your Calculation
             document.getElementByID(hdnID).Value=CalcValue;
          }
    

    3.在DropDown PostBack事件中再次绑定GridView。

    上面的代码应该可以解决您面临的问题。

    【讨论】:

    • 问题是我没有将任何数据绑定到网格,我只是在下拉列表的选定索引上填充了一些值。所以 RowDataBound 没有被解雇。
    • 我看到你没有绑定 GridView 并且你想保留值,你仍然可以将值分配给 HiddenField 并且在页面加载中的回发之后将该 HiddenField 值分配回 Span...使用“GridViewRow”GridViewRow selectRow = grd.Rows(索引)。 HtmlGenericControl spnKj=(HtmlGenericControl)selectRow.Cells[3].FindControl("spnKj"); spnKj.innerHTML=隐藏字段值;
    【解决方案2】:

    您可以使用“AutoPostBack”属性来控制某些控件的回发事件。

    【讨论】:

    • 回发需要发生,我只需要保留通过javascript更新的控件中的值。
    • 我认为您可以将控件值保留在视图状态或会话中,然后在回发时将其加载回来
    【解决方案3】:

    查看您的下拉列表选择是否执行任何 PostBack。

    如果是,则 span 值会消失,因为 Span 不是 ASP.NET webcontrol。页面回发后,asp.net webcontrol 值将从 ViewState 中恢复。所以,spans 没有 ViewState 并且没有值被恢复。 您可以尝试将标签更改为

     <span runat="server" id="spanIDHere">SomeValue here</span>
    

    runat="server" 将 span 设为 HtmlGenericControl 并保持其 ViewState。

    如果您使用 Javascript 更新跨度值,则回发后将不会保存它们。您应该调用服务器端函数来更新跨度值或尝试使用隐藏字段来存储您的值。

    【讨论】:

    • 将跨度更改为 runat="server" 仍然不保留该值,我之前尝试使用 asp.net 标签来存储该值,但这也不起作用。跨度>
    • 我已经添加了Gridview代码,你还有什么想看的吗?
    • 如果您使用 Javascript 更新您的 Span 值,那么它仅适用于客户端。在 PostBack 之后,这些值将不会在服务器端看到。您需要调用一些服务器端函数或尝试使用隐藏字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多