我正在尝试使用小的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>