0

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

4

3 回答 3

0

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

于 2012-08-22T09:27:14.383 回答
0

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

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

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

runat="server"使 span 为 HtmlGenericControl 并维护其 ViewState。

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

于 2012-08-22T08:43:07.697 回答
0

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

  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。

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

于 2012-08-22T09:43:13.897 回答