我正在尝试使用小的JavaScript脚本访问中继器中的文本框。当用户从列表中选择一个选项时,它由ajax自动完成功能调用。

由于JavaScript无法访问文本框(ID = ContactID),因此无法正常工作。原因是因为它在中继器中。那么,如何修改脚本以访问转发器中的特定文本框?

<script type="text/javascript" >
    function OnContactSelected(source, eventArgs) {
    $get('<%# ContactID.ClientID %>').value = eventArgs.get_value();
    }
</script>


中继器代码:

<asp:repeater ID="itemsRepeater"
      OnItemDataBound="itemsRepeater_ItemDataBound"
      runat="Server">
   <itemtemplate>
      <tr>
         <td>
          <asp:RadioButtonList runat="server"  DataSource="<%#         ((Outlet)Container.DataItem).OutletInformations %>" DataValueField="DateOfDelivery" DataTextField="DateOfDelivery" />
         </td>
         <td>
            <asp:TextBox ID="ContactID" runat="server"/>
         </td>
      </tr>
   </itemtemplate>
</asp:repeater>

最佳答案

看来您的问题是您实际上并未针对任何“特定”文本框。中继器的每一行都会有一个这样的文本框,并且由于数据绑定的性质,这些文本框将始终仅在运行时可用。

要解决此问题,您需要执行以下两项操作之一。较难但更完整的答案是使用转发器的onItemDatabound事件,并从该事件的eventArgs中拉出子控件。如果要在代码隐藏中修改子控件,这将是您唯一的选择。

但是,由于您是通过javascript执行此操作的,而且(表面上)希望此自动完成功能在每个文本框上运行,因此只需为表格行提供一个类,然后在其中定位目标呈现的输入标签即可:

.aspx:

<itemtemplate>
      <tr>
         <td>
          <asp:RadioButtonList runat="server"  DataSource="<%#         ((Outlet)Container.DataItem).OutletInformations %>" DataValueField="DateOfDelivery" DataTextField="DateOfDelivery" />
         </td>
         <td class="autocomplete">
            <asp:TextBox ID="ContactID" runat="server"/>
         </td>
      </tr>
   </itemtemplate>


JS:

<script type="text/javascript" >
    function OnContactSelected(source, eventArgs) {
      var fields = document.querySelectorAll(".autocomplete input");
      for(var i = 0; i < fields.length; i++){
        fields[i].value = eventArgs.get_value();
      }
    }
</script>

10-05 20:38
查看更多