2017-02-06 44 views
0

我有包含另一個子中繼器的父中繼器。 爲了簡單起見,讓我們說兒童中繼器包含文本框和Requiredvalidator。在ASP.NET Web窗體中我想用javascript控制兒童中繼器中的控制器

標記的簡單的例子:

<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> 

我創造這樣的方法來獲取第二中繼的RequiredField ID:

function getId(){ 

var myId = document.getElementById('<%= rfv21.ClientID %>'); 
} 

但當然沒有工作,有一個例外:

The name control-name Does Not Exist in the Current Context 

那麼我該如何做到這一點?

我想提一提的是,企業需要對我來說,當平變化,的onkeyup,onkeydown事件事件火災的txt21它會得到它的等效rfv21和enbale它:

我創建這個方法,激發了平變化,的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是:

<asp:TextBox ID="txt21" runat="server" CssClass=".." MaxLength="7" onkeyup="javascript: txt21_onChange(this);this.oldvalue = this.value;" /> 

,但此行希望工作:

var myRfv2 = document.getElementById('<%= rfv2.ClientID %>'); 

正如我之前解釋過的。

我認爲Item.FindControl(..)可能會有所幫助,但我們如何在這種情況下使用它?

+0

有將是很多很多'rfv21'控制 - 每個父轉發行將會有多達數其兒童中繼器行。每個人都將有一個生成的ID。你想一次訪問一個特定的一個還是全部? – Andrei

+0

我想訪問特定的一個rfv21當txt21 onchange激發我想訪問它的rfv21來啓用它 – Marzouk

+0

然後你需要訪問它相對於它的txt。你使用jQuery嗎?將它相當簡單的任務 – Andrei

回答

1

這裏的問題是會有很多這樣的控件,每個子中繼器每行一個。所有的生成ID都會略有不同。因此,而不是通過ID(不可能)查詢它們,你可以使用jQuery快速找到它們相對該觸發的事件的TXT:

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中的服務器端控件輕鬆做到這一點。此外,驗證程序在您的代碼中未被禁用。雖然我相信所有這些在這裏都值得一個單獨的問題>

2

您可以綁定來自Repeater Repeater.ItemDataBound事件的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 
} 
+0

這也是一個好的和可以接受的答案,但我選擇另一個,因爲它會更乾淨,更容易做到這一點客戶端 – Marzouk