如何保存动态复选框更改

时间:2013-04-18 18:02:57

标签: c# asp.net .net c#-4.0 event-handling

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

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;
    }
}

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

5 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分:2)

如果你施放它还会出错吗?

e.g。

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

}

答案 2 :(得分:0)

你应该把控制权交给CheckBox:

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

}

答案 3 :(得分: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.
    }
}

答案 4 :(得分:0)

尝试使用CheckBoxList然后执行类似的操作

        for (int i = 0; i < chkList.Items.Count; i++)
        {
            if (chkList.Items[i].Selected)
            {
                // Store Item
            }
        }