3

我几乎没有动态创建的复选框,并且将显示现有的选择,但是当用户进行更改时,我想将它们存储回来。这是动态生成和选择的代码

private void Role(string role)
{
   SystemUserDal dal = new SystemUserDal();
   var userId = Guid.Parse(Request.QueryString["ID"].ToString());
   var roles = dal.GetRolesList(userId);
   foreach (KeyValuePair<Guid, string> r in roles)
   {
       CheckBox chk = new CheckBox();
       chk.ID = r.Value;
       chk.Text = r.Value;
       if (role.Contains(r.Value))
       {
          chk.Checked = true;
       } 
       rolepanel.Controls.Add(chk);
   }
}

我正在尝试以下

private void GetCheckBoxes()
{
    foreach (Control ctrl in rolepanel.Controls)
    {
        CheckBox c = ctrl as CheckBox;
        string id = c.ID;
        string role = c.Text;
    }
}

当我单步执行代码时,它会以 3 的计数命中 foreach 循环,但 ctl 为空。任何线索?

4

5 回答 5

4

您可能会收到错误,rolepanel.FiondControl("chk")因为null它没有找到带有ID="chk". 方法FindControl接受一个字符串 - 您要查找的控件的 ID。您添加的复选框没有ID="chk",它们都ID=r.value来自您的代码。我建议为 ID 提供一些架构,您可以稍后使用它们来查找复选框。

如果您rolepanel只包含动态添加的复选框,则可以使用rolepanel.Controls来获取所有这些复选框。

不要忘记将控件投射到CheckBox.

所以你GetCheckBoxes()可能看起来像:

private void GetCheckBoxes()
{
    foreach (Control ctrl in rolepanel.Controls)
    {
        if (ctrl is CheckBox)
        {
            CheckBox c = ctrl as CheckBox;
            string cText = c.Text;

            // do what you need to do with cText, or checkbox c
        }
    }
}
于 2013-04-18T18:09:47.097 回答
2

如果你施放它仍然会出错吗?

例如

private void GetCheckBoxes()
{
    CheckBox chk = (CheckBox)rolepanel.FindControl("chk");
    if(chk!= null)

}
于 2013-04-18T18:05:34.097 回答
0

另一个解决方案是为 CheckBox.CheckedChanged 创建公共处理程序。然后,您的所有动态 CheckBoxes CheckedChanged 事件都将绑定到该处理程序。

public void Checkbox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox checkBox = sender is CheckBox;
    if(checkbox!=null)
    {
         //do your saving things.
    }
}
于 2013-04-18T18:34:31.967 回答
0

尝试使用 CheckBoxList 然后做这样的事情

        for (int i = 0; i < chkList.Items.Count; i++)
        {
            if (chkList.Items[i].Selected)
            {
                // Store Item
            }
        }
于 2013-04-18T18:34:55.507 回答
0

you should cast control to CheckBox:

private void GetCheckBoxes()
{
    CheckBox chk = (CheckBox)rolepanel.FindControl("chk");
    if(chk!= null)
    ....

}
于 2013-04-18T18:07:02.050 回答