[ASP.NET]在javascript取得GridView的TemplateField(樣板欄位)內的控制項ID

摘要:[ASP.NET]在javascript取得GridView的TemplateField(樣板欄位)內的控制項ID

在使用GridView控制項時我們常常會用到TemplateField(樣板欄位),

而樣板欄位內也常常會放入一些我們需要的控制項(Button,TextBox,CheckBox....),

這些控制項如果我們在設計階段在.aspx看到的控制項ID只有一個,

如下所示:

<asp:TemplateField HeaderText="使用者設定值">
       <ItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox>
       </ItemTemplate>
</asp:TemplateField>

但是因為GridView是動態隨著資料來增加列數,

而網頁上的控制項ID又都是獨一無二的,

因此網頁畫面呈現時,

我們以右鍵檢視網頁原始檔時會看到GridView的每個列看到的控制項ID都不再是剛剛的 ID="TextBox1",

取而代之的是:

<input name="_ctl0:MainContent:GridView1:_ctl2:TextBox1" type="text"  id="_ctl0_MainContent_GridView1__ctl2_TextBox1"  />

<input name="_ctl0:MainContent:GridView1:_ctl3:TextBox1" type="text"  id="_ctl0_MainContent_GridView1__ctl3_TextBox1"  />

<input name="_ctl0:MainContent:GridView1:_ctl4:TextBox1" type="text"  id="_ctl0_MainContent_GridView1__ctl4_TextBox1"  />

.aspx在網頁呈現時給了我們控制項不一樣的ID,

所以當我需要在Client端用javascript 來驗證這個樣板欄位的控制項時,

可以在GridView的PreRender事件內先取得網頁呈現時的控制項ID,

把它們存放在一個HiddenField內:

protected void GridView1_PreRender(object sender, EventArgs e)
{   
   foreach(GridViewRow row in GridView1.Rows)
   {
      this.HiddenField1.Value += row.Cells[5].FindControl("TextBox1").ClientID+",";
   }
}

然後javascript再從HiddenField內取出我們要的ID:

function ClientValidate(source, arguments) {
        
    var textBoxIds = document.getElementById("<%=HiddenField1.ClientID%>").value.split(',',<%=GridView1.Rows.Count%>);
      
    for(i=0;i<textBoxIds.length;i++)
    {
        //這裡寫我們要對這些控制項做的驗證動作   
    }     
}

還有另外一種比較簡單的做法,

不需要取得樣板欄位的正確ID,

但是使用上較有限制 : 必須是對同樣類型的控制項要做同樣的驗證!!!

因為這樣並沒有取得正確ID去指定要對那個控制項驗證,

直接只用javascript的做法:

function ClientValidate(source, arguments) {
        
    var grid = document.getElementById("<%=GridView1.ClientID%>");
    
    if (grid != null) 
    {
       var textBoxs = grid.getElementsByTagName("input");   
       for(i=0;i<textBoxIds.length;i++)
       {
         //這裡寫我們要對這些控制項做的驗證動作   
       }  
    }   
}