2011-04-11 58 views
1

好吧,所以我把我自己的Javascript與ASP服務器控件結合起來有一點問題。JavaScript與ASP:中繼器中的TextBox

圖片:我有幾個ASP:文本框在我的網頁上,由中繼器創建。我的目標是將用戶鍵入的所有值彙總到這些文本框中。只要用戶將某些內容更改爲文本框的內容,就必須發生這種情況。 (在頁面的底部,我有一個小的價格計算,這與服務器端代碼的作品,但我想使它更有活力,我說的是txtTeam和txtPart)

<asp:Content ID="Content3" ContentPlaceHolderID="contentPlaceHolder" runat="Server"> 
<script type="text/javascript"> 
</script> 

<div id='inputDiv'> 
    <h1> 
     Students per team</h1> 
    <table> 
     <tr> 
      <td> 
       Team 
      </td> 
      <td> 
       Actual 
      </td> 
      <td> 
       Maximum 
      </td> 
     </tr> 
     <asp:Repeater ID="Repeater2" runat="server" DataSourceID="odsTeams"> 
      <ItemTemplate> 
       <tr> 
        <td id='td<%# Eval("team_id") %>'> 
         <%# Eval("name") %> 
        </td> 
        <td id='txtTeam<%# Eval("team_id") %>'> 
         <asp:TextBox ID="txtTeam" runat="server"></asp:TextBox> 
         <asp:RangeValidator EnableClientScript="true" ID="rgvTeams" runat="server" ErrorMessage="*" 
          MinimumValue="0" MaximumValue='<%# Eval("st_max") %>' ControlToValidate="txtTeam"></asp:RangeValidator> 
        </td> 
        <td id='lblTeam<%# Eval("team_id") %>'> 
         <asp:Label runat="server"> 
         <%# Eval("st_max") %> 
         </asp:Label> 
        </td> 
       </tr> 
      </ItemTemplate> 
     </asp:Repeater> 
    </table> 
    <asp:ObjectDataSource ID="odsTeams" runat="server" OldValuesParameterFormatString="original_{0}" 
     SelectMethod="GetTeamsByDelegationID" TypeName="ERASTableAdapters.tbl_teamTableAdapter" 
     OnSelecting="odsTeams_Selecting"> 
     <SelectParameters> 
      <asp:Parameter Name="delegation_id" Type="Int32" /> 
     </SelectParameters> 
    </asp:ObjectDataSource> 
    <h1> 
     Additional Participants</h1> 
    <table> 
     <tr> 
      <td> 
       Category 
      </td> 
      <td> 
       Actual 
      </td> 
      <td> 
       Maximum 
      </td> 
     </tr> 
     <asp:Repeater ID="Repeater1" runat="server" DataSourceID="odsParticipantsCat"> 
      <ItemTemplate> 
       <tr> 
        <td id='<%# Eval("participant_category_id") %>'> 
         <%# Eval("name") %> 
        </td> 
        <td id='txtPart<%# Eval("participant_category_id") %>'> 
         <asp:TextBox ID="txtPart" runat="server" Enabled='<%# getMax(Eval("key").ToString()) > 0 %>'></asp:TextBox> 
         <asp:RangeValidator EnableClientScript="true" ID="rgvPart" runat="server" ErrorMessage="*" 
          MinimumValue="0" MaximumValue='<%# getMax(Eval("key").ToString())%>' ControlToValidate="txtPart"></asp:RangeValidator> 
        </td> 
        <td id='lblPart<%# Eval("participant_category_id") %>'> 
         <asp:Label runat="server"> 
         <%# getMax(Eval("key").ToString())%> 
         </asp:Label> 
        </td> 
       </tr> 
      </ItemTemplate> 
     </asp:Repeater> 
     <asp:ObjectDataSource ID="odsParticipantsCat" runat="server" OldValuesParameterFormatString="original_{0}" 
      SelectMethod="GetAdditionalParticipantCategories" TypeName="ERASTableAdapters.tbl_participant_categoryTableAdapter"> 
     </asp:ObjectDataSource> 
    </table> 
</div> 
<h1> 
    Advance to be paid</h1> 
<table> 
    <tr> 
     <td> 
      Number of participants 
     </td> 
     <td> 
      Days 
     </td> 
     <td> 
      Price 
     </td> 
     <td> 
      Total 
     </td> 
    </tr> 
    <tr> 
     <td runat="server" id="tdNumberPart1"> 
      0 
     </td> 
     <td runat="server" id="tdDays1"> 
      0 
     </td> 
     <td runat="server" id="tdPrice1"> 
      0 
     </td> 
     <td runat="server" id="tdTotal1"> 
      0 
     </td> 
    </tr> 
    <tr> 
     <td runat="server" id="tdNumberPart2"> 
      0 
     </td> 
     <td> 
      N/A 
     </td> 
     <td runat="server" id="tdPrice2"> 
      0 
     </td> 
     <td runat="server" id="tdTotal2"> 
      0 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td runat="server" id="tdGrandTotal" style="font-weight: bold"> 
      0 
     </td> 
    </tr> 
</table> 
<asp:Button runat="server" ID="btnConfirm" Text="Confirm" OnClick="btnConfirm_Click" 
    Style="height: 29px" /> 
    <asp:Label runat="server" ID="lblInfo"></asp:Label> 

回答

2

給出您的表格ID,例如<table id="students"><table id="additional">。然後,迭代行,在每行中找到輸入元素,並按照要求對值進行求和:

function sumTable(id) 
{ 
    var count = 0; 
    var studentTable = document.getElementById(id); 
    for (var i=1; i in studentTable.rows; i++) 
    { 
     var r = studentTable.rows[i]; 
     var input = r.getElementsByTagName("input")[0]; 
     var n = parseFloat(input.value); 
     if (isFinite(n)) count += n; 
    } 
    return count; 
} 
var totalParticipants = sumTable("students") + sumTable("additional"); 
+0

謝謝。此方法的工作原理,但現在我的自定義JavaScript與我的RangeValidator(有時)衝突。在studentstable中,我的字段現在總是無效的。附加表格仍然有效。我嘗試了不同的事件(onkeyup,onblur,...),但是他們都沒有解決這個問題。 – Jeroen 2011-04-12 08:31:10

+0

沒關係!感謝你們 – Jeroen 2011-04-12 09:29:44

0

使用像jquery這樣的庫,你可以很容易地選擇特定div中的所有輸入框(比如說你的repeater div),或者你可以專門爲這些輸入框添加一個類,並以這種方式抓取它們。

將函數調用附加到onblur方法,以便當它們離開文本框時,可以對它們進行總結。