错误问题:
同一个页面内有N个table其中一个里面有repeater,对于这个table
不能添加runat="server" 一旦添加运行就报错,其他的table都没关系
报的错误是:编译器错误消息: CS1502: 与“System.Web.UI.HtmlControls.HtmlTableRowCollection.Add(System.Web.UI.HtmlControls.HtmlTableRow)”最匹配的重载方法具有一些无效参数
TableWeb 服务器控件与其他表元素的比较:
通常,表不仅用来显示表格信息,它还是在网页上格式化信息的一种方法。在 Web窗体页上创建表有多种方法:
1,HTML 表。您可以添加 HTML <table>元素。如果所创建的是静态表(运行时将不在其中添加或更改内容的表),则应使用 HTML 表,且不要使用 Table 控件。
2,HtmlTable 控件。这是一个 <table>HTML 元素,已通过添加 runat=server 属性将其转换为 HTML 服务器控件。您可以在服务器代码中对该控件进行编程。
<table>
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
3,Table。这是一种 Web 控件,它允许您使用与其他 Web控件一致的对象模型来创建和操作表(例如,添加表行和单元格)。
<asp:Table ID="Table1" runat="server"></asp:Table>
通常,当您希望在运行时通过代码向表中添加行和单元格(列)时,可使用 Table Web服务器控件。尽管您也可以将其用作带有预定义行和列的静态表,但在这种情况下,使用 HTML <table> 元素更为简单。
Table Web 服务器控件比 HtmlTable 控件更易于编程,因为它提供了与其他Web 服务器控件一致的、具有类型化属性的对象模型。(此模型在 Table、TableRow 和 TableCell 控件之间也是一致的。)
因为需要查询界面上的table中的值,固需要添加runat=server,出现错误。
解决方法:
既然给table添加runat=server会报错,那么我们将table的父类添加runat=server在这里即div,然后取得它的子类对象,即可得到table的值(在div中通过FindControl发现控件这个方法取得)。
html代码:
<div class="cnt" style="width:100%; height:165px; overflow:scroll;" id="StuClass" runat="server">
<table class="data-table history" id="dtStudent" border="0" cellspacing="0" cellpadding="0" width="400px" >
<tbody>
<asp:Repeater ID="repStudent" runat="server">
<ItemTemplate>
<tr>
<td align="center"><asp:CheckBox ID="CheckBox3" runat="server"></asp:CheckBox></td>
<td class="txt c">
<%#Eval("TeacherCode") %>
</td>
<td class="txt c">
<%#Eval("TeacherCode") %>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</tbody>
</table>
</div>
web层代码:
protected void lbtnAdd_Click(object sender, EventArgs e)
{
//通过包含班级table的div找到班级table,并转换成html对象,其中StuClass为div的id值
System.Web.UI.HtmlControls.HtmlTable dtStudent = (System.Web.UI.HtmlControls.HtmlTable)StuClass.FindControl("dtStudent");
//班级下的学生
DataTable dt = BindClassByStudent();
TeaExamineeBLL TeaExamineeBLL = new BLL.Teacher.TeaExamineeBLL();
//ArrayList arrStudentInfo = new ArrayList(); //定义某种类型的考生的集合
DataTable dtStudentInfo = new DataTable();
bool flagIsChecked = false;
for (int i = 0; i < dtStudent.Rows.Count - 1; i++)
{
CheckBox ChkBxItem = (CheckBox)dtStudent.Rows[i].FindControl("chkStu");
if (ChkBxItem.Checked == true)
{
flagIsChecked = true;
//退出for循环;
break;
}
}
}
总结:对于这个问题已经有解决办法,但是仍然不是很明白,为什么当table包含repeater时且两个都有runat属性时,就会出错,单独使用table加runat却没有问题。而且repeater可以嵌套任何服务器控件,也不会出问题。
PS-简单理解:可能是对于html控件(加runat=server)后变成服务器控件扔不可以嵌套真正的服务器控件,不知道对不对,希望大家指点!