ASP.NET Gridview:如何在回发时停止Gridview中的<span> </span>重置?

时间:2012-08-22 08:34:42

标签: asp.net gridview postback

我有一个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>

                        

3 个答案:

答案 0 :(得分:0)

看一下你的下拉列表选择是否有任何PostBack。

如果是,则span值消失,因为Span不是ASP.NET webcontrol。页面回发后,将从ViewState恢复asp.net webcontrol值。因此,跨度没有ViewState,也没有恢复值。 您可以尝试将代码更改为

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

runat =“server” 使span成为HtmlGenericControl并维护其ViewState。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

从你的问题我所理解的是你在javascript中进行计算并将其分配给span,但是当下一次回发发生时,值不会被保留...如果我是对的,我会建议你尝试以下步骤。使用HiddenFields也可以将值指定为HiddenFields在PostBacks期间保留值。

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

  2. 将Codebehind的“计算”功能设置为Textbox(来自rowdatabound事件)&amp;还将currosponding HiddenField Value作为计算传递给它(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:

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

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

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

    上述代码应该处理您正面临的问题。