可以看到生成的Label的控件的ID诸如:Label1_0正是上面所述格式:该控件自身ID(Label1)+"_"+[ClientIDRowSuffix](0)。
<3>如果父容器控件的ClientIDMode值为Predictable
如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:父容器控件的ClientID+"_"+该控件自身ID+"_"+[ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会单独说明,可见这种情况才属于MSDN上所说的格式。 如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么该控件的ClientID格式为:父容器控件的ClientID+"_"+该控件自身ID,可见这种情况才是MSDN上所说的格式。下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为Predictable的例子,将上面的代码再做更改,将Label1的ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode也为Predictable:
<asp:GridView ID="grd_Account" runat="server" AllowPaging="True"
AutoGenerateColumns="False"
DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px"
Width="676px" PageSize="5" ClientIDMode="Predictable" >
<Columns>
<asp:TemplateField HeaderText="Account Number" Sort ="Account Number">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
其生成的HTML代码为:
<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
<tr>
<th scope="col">Account Number</th>
</tr>
<tr>
<td>
<span id="grd_Account_Label1_0">Logged</span>
</td>
</tr>
<tr>
<td>
<span id="grd_Account_Label1_1">Logged</span>
</td>
</tr>
<tr>
<td>
<span id="grd_Account_Label1_2">Logged</span>
</td>
</tr>
</table>
可以看到生成的Label的控件的ID诸如:grd_Account_Label1_0正是上面所述格式:父容器控件的ClientID(grd_Account)+"_"+该控件自身ID(Label1)+"_"+[ClientIDRowSuffix](0)。
<4>如果父容器控件的ClientIDMode值为Inherit
这种情况没什么好说的,因为父容器控件的ClientIDMode值会继承其所在更上层的祖先容器控件的ClientIDMode值,继承后也属于上面三种情况之一。
最后来说说ClientIDRowSuffix部分是什么,如果父容器控件或祖先容器控件是显示多数据行的容器控件(后面会讨论到如果控件的ClientIDMode为Predictable,在判断该控件是否在显示多数据行的容器控件中时,会有一种特殊的穿透现象),那么父容器控件或祖先容器控件会有个属性叫ClientIDRowSuffix,比如本例中的GridView的ClientIDRowSuffix属性,这个属性的作用是为设定ClientIDMode值为Predictable的子控件生成ClientID的后缀字符串(就是上面那些ClientID格式中的ClientIDRowSuffix部分):








