我有一个gridview以如下格式呈现:
<div>
<table>
<thead>
<tr><th></th></tr>
</thead>
<tbody>
<tr><td></td></tr>
</tbody>
</table>
</div>
gridview/row等的子类为每一行添加一个id
row.ID = "item" + row.DataItemIndex.ToString();
row.ClientIDMode = Predictable;
但是当它被渲染到页面上时,行中控件的ClientID
中没有这个id。
<TABLE>
<TBODY>
<TR id="MainContent_mygridview">
<TD>
<SPAN id="MainContent_mygridview_label1_0">This is on page one</SPAN>
</TD>
</TR>
<TR id="MainContent_mygridview">
<TD>
<SPAN id="MainContent_mygridview_label1_1">This is on page one</SPAN>
</TD>
</TR>
</TBODY>
<TBODY>
<TR id="MainContent_mygridview">
<TD>
<SPAN id="MainContent_mygridview_label1_0">This is on page two</SPAN>
</TD>
</TR>
<TR id="MainContent_mygridview">
<TD>
<SPAN id="MainContent_mygridview_label1_1">This is on page two</SPAN>
</TD>
</TR>
</TBODY>
</TABLE>
这成为一个问题,因为我在页面上有一些ajax,在请求时获得下一个"页面"值的行,并将它们添加到gridview(作为额外的tbody
)。这会导致DOM中ID的冲突。
所以在挖掘之后,我发现可预测的id使用GridViewRow
的DisplayIndex
属性。
int System.Web.UI.IDataItemContainer.DisplayIndex
{
get
{
return this.DataItemIndex;
}
}
我的子类:
public class GridViewRow :
System.Web.UI.WebControls.GridViewRow, System.Web.UI.IDataItemContainer
我不确定为什么子类需要,因为系统gridviewrow已经实现了那个接口,所以也许其他人可以添加到这个。
我也不确定这是否会破坏其他任何东西。
,但现在元素得到一个id,以他们的DataItemIndex结束,使他们在整个数据集中唯一,而不仅仅是"页"。