2016-07-15 66 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應用程序的整個過程將發生在每個帖子後面,所以你不能添加一些東西給你的控件,並期望它在那裏時,下次回發發生。 要解決此問題,您必須將數據添加到數據容器,然後將數據源綁定到控件,或者從數據源中自行添加它們。 –