0

ユーザーがグリッドビューから選択したときにサーバーから更新されるいくつかのコントロールを含むグリッドビューがあります。

ドロップダウン リストから選択した後、ユーザーは行のテキスト ボックスにパーセンテージを入力できます。いくつかの計算を実行し、Gridview のアイテム テンプレート内のスパンに出力する JavaScript があります。

これはすべて機能しますが、ユーザーが任意の行で別のドロップダウン リストを選択すると、グリッドビューのすべてのスパンが空白にリセットされます (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

あなたの質問から私が理解したことは、あなたがjavascriptで計算を行ってスパンに割り当てているということですが、次のポストバックが発生すると値は保持されません...私が正しい場合は、次の手順を試すことをお勧めします.HiddenFieldsを使用してくださいまた、ポストバック中に値を保持する HiddenFields として値を割り当てます。

  1. 項目テンプレートに非表示フィールドを追加

  2. Codebehind (rowdatabound イベントから) から "calculate" 関数を Textbox に設定し、現在の HiddenField 値を calculate(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 に答える
0

「AutoPostBack」プロパティを使用して、一部のコントロールの Postback イベントを制御できます。

于 2012-08-22T09:27:14.383 に答える
0

ドロップダウン リストの選択で PostBack が実行されるかどうかを確認してください。

存在する場合、スパンは ASP.NET Web コントロールではないため、スパンの値は表示されなくなります。ページがポストバックされた後、asp.net Web コントロールの値が ViewState から復元されます。そのため、spans には ViewState がなく、値は復元されません。タグを次のように変更してみることができます

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

runat="server"は、スパンを HtmlGenericControl にし、その ViewState を維持します。

Javascript を使用してスパン値を更新すると、ポストバック後にスパン値が保存されません。サーバー側関数を呼び出してスパン値を更新するか、隠しフィールドを使用して値を保存してください。

于 2012-08-22T08:43:07.697 に答える