我有几个动态创建的复选框,将显示现有选项但是当用户进行更改时我想将它们存储回来。这是生成和动态选择的代码
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。任何线索?
答案 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
}
}