为什么findcontrol需要唯一的id,当我给它扫描行时

时间:2010-09-04 05:24:08

标签: c# findcontrol

代码

    public partial class Table_Traversing : System.Web.UI.Page
        {
        Table table1 = new Table();

        Button button1 = new Button();

        protected void Page_Load(object sender, EventArgs e)
        {
            for (int adding_rows = 0; adding_rows < 4; adding_rows++)
               {
               TableRow table_row1 = new TableRow();
               TableCell table_cell1 = new TableCell();
               TableCell table_cell2 = new TableCell();
               Label The_text = new Label();
               CheckBox checkmate = new CheckBox();
               The_text.Text = "This is the text :-)";
               checkmate.ID = "checkmate";
               table_cell2.Controls.Add(checkmate);
               table_cell1.Controls.Add(The_text);
               table_row1.Controls.AddAt(0, table_cell1);
               table_row1.Controls.AddAt(1, table_cell2);
               table1.Rows.Add(table_row1);
               }
            button1.Text = "click me to export the value";
            form1.Controls.AddAt(0, table1);
            form1.Controls.AddAt(1, button1);
            button1.Click += new EventHandler(button1_Click);     
        }

        void button1_Click(object sender, EventArgs e)
        {
        CheckBox check_or_not = new CheckBox();
         for (int i = 0; i < table1.Rows.Count; i++)
            {
             check_or_not = (CheckBox)table1.Rows[i].FindControl("checkmate");
             Response.Write(check_or_not.Checked.ToString());
             }       
         }
      }

错误

  

找到具有相同ID'将死'的多个控件。 FindControl要求控件具有唯一ID。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.Web.HttpException:找到具有相同ID“checkmate”的多个控件。 FindControl要求控件具有唯一ID。

2 个答案:

答案 0 :(得分:2)

只需将行号附加到ID:

checkmate.ID = "checkmate" + adding_rows.ToString();

当然,也可以将它附加到FindControl参数:

check_or_not = (CheckBox)table1.Rows[i].FindControl("checkmate" + i.ToString());

答案 1 :(得分:0)

您已将复选框添加到单元格,而不是行:

table_cell2.Controls.Add(checkmate);

因此 - 一行有多个id为“checkmate”的单元格:

E.g

<tr id="somerow">
   <td><input type="checkbox" id="checkmate"/></td>
   <td><input type="checkbox" id="checkmate"/></td>
</tr>

因此,在“somerow”行中,有多个ID为“checkmate”的复选框。

您添加复选框的代码看起来似乎只是添加了一个 - 所以它一定是您错过的。

尝试删除FindControl代码并查看实际HTML呈现的内容。