可以't访问中继器中的“自动完成”文本框

Can't access textbox for Autocomplete in repeater

本文关键字:自动完成 文本 访问 中继器 可以      更新时间:2023-09-26

我正试图使用一个小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中提取子控件。如果您想修改codebehind中的子控件,这将是您唯一的选择。

然而,因为您是从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>