在ASP.NET Web表单中,我希望使用javascript在子转发器中获得控制权
我有一个包含另一个子中继器的父中继器。 为了简单起见,假设子中继器包含文本框和Requiredvalidator 标记的简单示例:在ASP.NET Web表单中,我希望使用javascript在子转发器中获得控制权,javascript,c#,asp.net,webforms,asp.net-controls,Javascript,C#,Asp.net,Webforms,Asp.net Controls,我有一个包含另一个子中继器的父中继器。 为了简单起见,假设子中继器包含文本框和Requiredvalidator 标记的简单示例: <asp:Repeater ID="rpt1" runat="server"> <HeaderTemplate> .... </HeaderTemplate> <ItemTemplate> <asp:Label ID="lbl1" runat="server" CssClass=".."><
<asp:Repeater ID="rpt1" runat="server">
<HeaderTemplate>
....
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="lbl1" runat="server" CssClass=".."></asp:Label>
<div class="..">
<asp:Repeater ID="rpt2" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<div class="...">
<asp:TextBox ID="txt21" runat="server" CssClass="..." MaxLength="7" CssClass="ErrorMessage" ErrorMessage="*" />
<asp:RequiredFieldValidator ID="rfv21" runat="server" CssClass="ErrorMessage" ErrorMessage="*" />
</div>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
那我该怎么做呢
我想提到的是,我的业务需求是,当txt21触发onchange、onkeyup、onkeydown事件时,它将得到等效的rfv21并启用它:
我创建了此方法,用于激发onchange、onkeyup和onkeydown事件已更改:
function txt21_onChange(txtbox) {
var newValue = this.value;
var oldValue = this.oldvalue;
var myRfv2 = document.getElementById('<%= rfv2.ClientID %>');
if (newValue != oldValue) {
ValidatorEnable(myRfv2, true);
}
}
函数txt21\u onChange(txtbox){
var newValue=此.value;
var oldValue=this.oldValue;
var myRfv2=document.getElementById(“”);
如果(新值!=旧值){
ValidatorEnable(myRfv2,true);
}
}
我将txt21更新为:
<asp:TextBox ID="txt21" runat="server" CssClass=".." MaxLength="7" onkeyup="javascript: txt21_onChange(this);this.oldvalue = this.value;" />
但这一行需要工作:
var myRfv2 = document.getElementById('<%= rfv2.ClientID %>');
var myRfv2=document.getElementById(“”);
正如我之前解释的那样
我认为Item.FindControl(..)可能会有所帮助,但在这种情况下我们如何使用它呢?这里的问题是,将有许多这样的控件,每行每个子中继器一个。所有生成的ID都略有不同。因此,您可以使用jQuery相对于触发事件的txt快速查找它们,而不是按id查询它们(不可能):
function txt21_onChange(txtbox) {
var rfv2 =
$(textbox) // gives you the jquery object representing the textbox
.closest("div") // the parent div
.find("id*='rfv2'"); // the element you are looking for, id contains rfv2
这回答了这个线程中关于如何获取元素的直接问题。但我不确定它能否解决启用/禁用验证这一更大的问题。使用javascript中的服务器端控件很难做到这一点。此外,在您的代码中,默认情况下不会禁用验证器。虽然我认为所有这些都值得在这里单独提一个问题,但这里的问题是,将有许多这样的控件,每行每个子中继器一个。所有生成的ID都略有不同。因此,您可以使用jQuery相对于触发事件的txt快速查找它们,而不是按id查询它们(不可能):
function txt21_onChange(txtbox) {
var rfv2 =
$(textbox) // gives you the jquery object representing the textbox
.closest("div") // the parent div
.find("id*='rfv2'"); // the element you are looking for, id contains rfv2
这回答了这个线程中关于如何获取元素的直接问题。但我不确定它能否解决启用/禁用验证这一更大的问题。使用javascript中的服务器端控件很难做到这一点。此外,在您的代码中,默认情况下不会禁用验证器。尽管我相信所有这些都值得在这里单独提一个问题,所以>您可以从Repeater事件绑定javascript函数调用 代码Bahind
void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txt21 = (TextBox)e.Item.FindControl("txt21");
RequiredFieldValidator rfv21 = (RequiredFieldValidator)e.Item.FindControl("rfv21");
txt21.Attributes.Add("onclick", "txt21_onChange('" + txt21.ClientID + "','" + rfv21.ClientID + "'" )
}
}
Javascript
function txt21_onChange(txt21ID, rfv21ID)
{
txt21ID = document.getElementById(txt21ID);
rfv21ID = document.getElementById(rfv21ID);
//The above are TextBox and RequiredFieldValidator objects of row of TextBox that triggered change event.
//You can use these object
}
您可以从Repeater事件绑定javascript函数调用 代码Bahind
void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txt21 = (TextBox)e.Item.FindControl("txt21");
RequiredFieldValidator rfv21 = (RequiredFieldValidator)e.Item.FindControl("rfv21");
txt21.Attributes.Add("onclick", "txt21_onChange('" + txt21.ClientID + "','" + rfv21.ClientID + "'" )
}
}
Javascript
function txt21_onChange(txt21ID, rfv21ID)
{
txt21ID = document.getElementById(txt21ID);
rfv21ID = document.getElementById(rfv21ID);
//The above are TextBox and RequiredFieldValidator objects of row of TextBox that triggered change event.
//You can use these object
}
将有很多
rfv21
控件-每个父中继器行将有与其子中继器行数相同的多个中继器行。每个都将有一个生成的id。您想访问一个特定的id,还是同时访问所有id?我想在txt21 onchange启动时访问一个特定的rfv21。我想访问它的rfv21以启用它,然后您需要相对于启动它的txt访问它。您使用jquery吗?这将是一项相当简单的任务。是的,我可以使用JQuery来完成这项任务。请检查我的问题更新。将会有很多rfv21
控件-每个父中继器行将有与其子中继器行数相同的数量。每个都将有一个生成的id。您想访问一个特定的id,还是同时访问所有id?我想在txt21 onchange启动时访问一个特定的rfv21。我想访问它的rfv21以启用它,然后您需要相对于启动它的txt访问它。您使用jquery吗?这将是一项相当简单的任务。是的,我可以使用JQuery来完成这项任务。请检查我对问题的更新。这也是一个好的和可接受的答案,但我选择另一个,因为它将更干净,更容易在客户端完成这项任务。这也是一个好的和可接受的答案,但我选择另一个,因为它将更干净,更容易做到客户端