面向对象的方式解决CS1502


错误问题:

 

同一个页面内Ntable其中一个里面有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属性时,就会出错,单独使用tablerunat却没有问题。而且repeater可以嵌套任何服务器控件,也不会出问题。

 

     PS-简单理解:可能是对于html控件(加runat=server)后变成服务器控件扔不可以嵌套真正的服务器控件,不知道对不对,希望大家指点!




评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值