【问题标题】:how to save dynamic check box changes如何保存动态复选框更改
【发布时间】:2013-04-18 18:02:56
【问题描述】:

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

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 的类型是什么?
  • 加载动态复选框的 asp 面板
  • programmer93 将加载动态复选框的 asp 面板

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


【解决方案1】:

您可能会收到错误,因为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
        }
    }
}

【讨论】:

  • 谢谢 Floremin 我试过了,所以如果选中了复选框,我会尝试将角色保存给用户,那么我如何才能选中复选框的文本?
  • 只需将ctrl 转换为CheckBox 即可正常访问其所有属性。我更新了代码。
  • 谢谢弗洛雷明。我的角色面板只包含动态复选框,但是当我尝试上面的代码时,它没有进入 if 循环。
  • 如果没有进入外观,则表示rolepanel 中没有控件。您何时在页面生命周期中调用GetCheckBoxes?您确定此时添加了复选框,或者您正在重新加载所有内容?稍微描述一下你的过程。
  • Floremin,点击保存按钮时会调用一个方法,将所有数据加载到用户那里以加载我正在调用 GetCheckBoxes 的用户的角色
【解决方案2】:

投了还会报错吗?

例如

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

}

【讨论】:

    【解决方案3】:

    您应该将控制权转换为 CheckBox:

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

    【讨论】:

      【解决方案4】:

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

      public void Checkbox_CheckedChanged(object sender, EventArgs e)
      {
          CheckBox checkBox = sender is CheckBox;
          if(checkbox!=null)
          {
               //do your saving things.
          }
      }
      

      【讨论】:

      • 选中或取消选中复选框时不会触发事件
      • 谷歌它为什么不被提出。有很多关于它的信息。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 2013-01-11
        • 2013-03-14
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多