2016-07-15 36 views
1

我有一个表格单元格,我在运行时用CheckBoxes和Labels填充。循环遍历表中的所有复选框

List<string> lstUserPool = new List<string>(); 
DataTable dt = GetData("SELECT UserName FROM eData ORDER BY UserName;", "Data Source = lewcomp1\\COMPLIANCE; Initial Catalog = ComplianceData; Integrated Security = True;"); 

for (int i = 1; i < dt.Rows.Count; i++) 
{ 
    CheckBox cb = new CheckBox(); 
    cb.ID = "cb" + dt.Rows[i]["Username"].ToString(); 
    Label lbl = new Label(); 
    lbl.ID = "lbl" + dt.Rows[i]["Username"].ToString(); 
    lbl.Text = dt.Rows[i]["Username"].ToString(); 
    lbl.Font.Size = new FontUnit("18px"); 

    if (IsOdd(i)) 
    { 
     cellUsersPoolLeft.Controls.Add(cb); 
     cellUsersPoolLeft.Controls.Add(lbl); 
     cellUsersPoolLeft.Controls.Add(new LiteralControl("<br/>")); 
    } 

    if (IsEven(i)) 
    { 
     cellUsersPoolRight.Controls.Add(cb); 
     cellUsersPoolRight.Controls.Add(lbl); 
     cellUsersPoolRight.Controls.Add(new LiteralControl("<br/>")); 
    } 
} 

后来,我想通过这些复选框来检查什么是Checked,什么不是。我尝试过在SO上发现的各种例子,但没有运气。这几乎就好像复选框不在我添加到的TableCell中。两个下面的循环都没有找到任何复选框控件:

foreach (Control ctl in cellUsersPoolRight.Controls) 
{ 
    if (ctl is CheckBox) 
    { 

    } 
} 
//foreach(var checkBox in cellUsersPoolRight.Controls.OfType<CheckBox>()) 
//{ 
// if (checkBox.Checked) 
// { 
//  naz.Add(checkBox.ID); 
// } 
//} 

回答

0

我建议你在转发器中使用Repeater和Databind复选框和标签到ItemTemplate。这很容易让你通过循环中继器获取数据。如果您需要其他数据,请在中继器内添加Hiddenfield以存储它们。

<asp:Repeater ID="UserRepeater" runat="server"> 
        <HeaderTemplate> 
         <table> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <tr> 
         <td> 
          <asp:CheckBox ID="UserCheckBox" runat="server" Checked='<%# Convert.ToBoolean(Eval("IsUserChecked")) %>' ToolTip='<%# Eval("UserId") %>' 
          onmouseover="title='';" /> 
         </td> 
         <td> 
          <asp:Label ID="UserNameLabel" runat="server" Text='<%# Eval("UserName") %>'></asp:Label> 
         </td> 
         </tr> 
        </ItemTemplate> 
        <FooterTemplate> 
         </table> 
        </FooterTemplate> 
        </asp:Repeater> 
在你的代码隐藏

然后

//initialize repeater data 
userRepeater.DataSource = dt; 
userRepeater.DataBind(); 

然后在你的imagebutton_click的回传,你可以从中继

foreach (RepeaterItem ri in UserRepeater.Items) 
       { 
       CheckBox userCheckBox = ri.FindControl("UserCheckBox") as CheckBox; 
       } 
+0

我非常喜欢这种方法,第一次使用中继器。谢谢!你知道我如何改变ItemTemplate以允许两列数据而不是1? –

+0

这是非常强大的,我用了它几次后,我去控制列表。这是复选框列表的完美选择。我有一些很棒的javascript,我用它来检查它们全部或者用jquery取消它们全部。这也是相当有用的功能。 – Enkode

+0

它已经有2列。看1列/ TD是复选框,1列/ TD是用户名。如果您想添加更多,只需添加td标记和附加数据即可。 – Enkode

0

对不起,我还不能写评论呢。

您试图添加控件的哪个事件以及您试图从哪个事件中读取?

看看this张贴阅读更多。 检查页面上的事件顺序,以及是否在生命周期中使用了正确的事件。

+0

这是一个图像按钮单击事件 –

+1

确定:) 在项目Web应用程序的整个过程将发生在每个帖子后面,所以你不能添加一些东西给你的控件,并期望它在那里时,下次回发发生。 要解决此问题,您必须将数据添加到数据容器,然后将数据源绑定到控件,或者从数据源中自行添加它们。 –