在ASP.NET Web表单中,我希望使用javascript在子转发器中获得控制权

在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=".."><

我有一个包含另一个子中继器的父中继器。 为了简单起见,假设子中继器包含文本框和Requiredvalidator

标记的简单示例:

<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来完成这项任务。请检查我对问题的更新。这也是一个好的和可接受的答案,但我选择另一个,因为它将更干净,更容易在客户端完成这项任务。这也是一个好的和可接受的答案,但我选择另一个,因为它将更干净,更容易做到客户端