如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么该控件的ClientID格式为:该控件自身ID,可见这个格式就是该控件自身ClientIDMode值继承父容器控件ClientIDMode值Static生成的ClientID结果(这里不明白请看前面的Static部分)。
下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为Static的例子,将上面的代码再做更改,将Label1的ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode为Static:
<asp:GridView runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Account Number" DataSourceID="sds_account" PageSize="5" ClientIDMode="Static" > <Columns> <asp:TemplateField HeaderText="Account Number" Sort ="Account Number"> <ItemTemplate> <asp:Label runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
其生成的HTML代码为:
<table cellspacing="0" rules="all"> <tr> <th scope="col">Account Number</th> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> </table>
可以看到生成的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 runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Account Number" DataSourceID="sds_account" PageSize="5" ClientIDMode="Predictable" > <Columns> <asp:TemplateField HeaderText="Account Number" Sort ="Account Number"> <ItemTemplate> <asp:Label runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
其生成的HTML代码为:
<table cellspacing="0" rules="all"> <tr> <th scope="col">Account Number</th> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>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部分):
如果 ClientIDRowSuffix 属性为空白,则在已生成的子控件ClientID末尾添加递增的行号并在行号前面加上下划线字符 (_) 分隔,比如上面的例子中由于都没有在GridView上设置ClientIDRowSuffix属性,所以ClientIDRowSuffix为空白,那么生成的子控件ClientID最末位都有诸如_0、_1、_2等的递增行号。