我有几个动态创建的复选框,现有的选择将被显示,但是当用户进行更改时,我想将它们存储回来。下面是动态生成和选择
的代码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为空。有线索吗?
您可能会得到错误,因为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
}
}
}
如果强制转换它还会出错吗?
。
private void GetCheckBoxes()
{
CheckBox chk = (CheckBox)rolepanel.FindControl("chk");
if(chk!= null)
}
您应该将控件强制转换为CheckBox:
private void GetCheckBoxes()
{
CheckBox chk = (CheckBox)rolepanel.FindControl("chk");
if(chk!= null)
....
}
另一个解决方案是为CheckBox.CheckedChanged创建公共处理程序。然后,所有的动态CheckBoxes CheckedChanged事件都将绑定到该处理程序。
public void Checkbox_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = sender is CheckBox;
if(checkbox!=null)
{
//do your saving things.
}
}
尝试使用CheckBoxList,然后执行如下操作
for (int i = 0; i < chkList.Items.Count; i++)
{
if (chkList.Items[i].Selected)
{
// Store Item
}
}