如何从asp.net中的checkboxlist控件返回所选项目

时间:2010-09-22 15:26:33

标签: c# asp.net

我试图在动态绑定的复选框列表控件中以字符串形式返回所选项目而没有运气。我希望有人可以提供帮助。在我的代码隐藏文件中,我正在连接一个名为users的类并构建一个数据表。然后我将数据表绑定到cblist控件

        private void populateUserList() //called on page load
    {

            SubmitOptions mySubmission = new SubmitOptions(juris, rptType, tmplName);

            if (mySubmission.Users.Count == 0)
            {
                lbl_juris.Visible = false;
                cb_selectUser.Visible = false;
                lbl_AlertMsg.Visible = true;
                btnSelect.Visible = false;
                lbl_AlertMsg.Text = "No supervisors listed for jursidiction: " + juris.ToString();
            }
            else
            {

                dt.Columns.Add("Users");
                for (int i = 0; i < mySubmission.Users.Count(); i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["Users"] = mySubmission.Users[i];
                    dt.Rows.Add(dr);
                }

                cb_selectUser.DataSource = dt;
                cb_selectUser.DataBind();
            }

     }

在主aspx文件中,我将控件定义为:

<asp:CheckBoxList ID="cb_selectUser"
       Width="400px" 
       Height="100%"
       AutoPostBack="false"  
       runat="server"  
       CellPadding="2"  
       CellSpacing="5"
       DataTextField="Users" 
       DataValueField="Users"
        >
        </asp:CheckBoxList>

我已经尝试了以下代码,我在列表中进行了检查,但只有当我将值作为列表项硬编码到Checkboxt列表中时,这似乎才有效。

 protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e)
    {
        for (int i = 0; i < cb_selectUser.Items.Count; i++)
        {
            if (cb_selectUser.Items[i].Selected)
            {

                selectedUsers += cb_selectUser.Items[i].Text;
            }
        }

列表填充正常,我想要做的就是从复选框列表控件中以字符串形式返回所有选定的用户。

正如我所说,如果我将项目值硬编码到控件中,上面的代码可以工作,我可以在字符串中看到所选项目,但是删除itemslist标签并切换到绑定nothign。上面的方法计算了整个返回数,但是没有选择任何选择。

我非常感谢任何有关我所缺少的提示或建议。

8 个答案:

答案 0 :(得分:9)

这里是完全符合您需要的完整页面代码。只需添加一个CheckboxList,将其命名为list1,将名称添加到btn并添加标签并将其命名为lbl。

protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                var dt = new DataTable();
                dt.Columns.Add("Users");

                const string str = "User {0}";
                for(var i=1;i<=10;i++)
                {
                    //var r = dt.NewRow();
                    //r.ItemArray=new object[]{string.Format(str,i)};
                    dt.Rows.Add(new object[] {string.Format(str, i)});
                }
                list1.DataSource = dt;
                list1.DataTextField = "Users";
                list1.DataBind();
            }
        }

        protected void btn_Click(object sender, EventArgs e)
        {
            var s = list1.Items.Cast<ListItem>()
                   .Where(item => item.Selected)
                   .Aggregate("", (current, item) => current + (item.Text + ", "));
            lbl.Text = s.TrimEnd(new[] {',', ' '});
        }

答案 1 :(得分:2)

你确定populateUserList()只被调用一次吗? (即不在回发上)。如果它被调用两次,则所选项目集合将为空白。

protected void Page_Load(object sender, EventArgs e)
{
  if(!IsPostBack)
  {
    populateUserList();
  }
}

答案 2 :(得分:2)

1-下载Jquery.json.js并将其作为参考添加到您的视图中:

<script src="../../Scripts/jquery.json.js" type="text/javascript"></script>
2- I've added a ".cssMyClass" to all checkboxlist items so I grab the values by their css class: 


 <script type="text/javascript" >
       $(document).ready(function () {
           $("#btnSubmit").click(sendValues);
         });

         function populateValues()
         {
             var data = new Array();
             $('.myCssClas').each(function () {
                 if ($(this).attr('checked')) {
                     var x = $(this).attr("value");
                     data.push(x);
                 }
             }); 

             return data;
         }

         function sendValues() {
             var data = populateValues();
                   $.ajax({
                       type: 'POST',
                       url: '@Url.Content("~/Home/Save")',
                       data: $.json.encode(data),
                       dataType: 'json',
                       contentType: 'application/json; charset=utf-8',
                       success: function () { alert("1"); }
                   });

           } 



     </script>

3-正如您所看到的,我已将所有选定的值添加到数组中,并通过ajax将其传递给“Home”控制器的“Save”操作 在Controller中,您可以通过添加数组作为参数来接收值:

 [HttpPost]
        public ActionResult Save(int[] val)
        {

我搜索得太多,但显然这是唯一的解决方案。如果您找到更好的解决方案,请告诉我。

答案 3 :(得分:2)

   string skills="";
   for(int i=0;i<chkboxlist.Items.Count;i++)
   {
       if(chkboxlist.Items[i].Selected)
       {
           skills=skills+chkboxlist.Items[i].Text+",";
       }
   }
   skills = skills.Remove(skills.Length-1);
   lblResult.Text = skills.ToString();

答案 4 :(得分:0)

您是否可以使用发件人检索所选项目并查看是否获得相同的结果?

protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e)
{
    CheckBoxList cbl = sender as CheckBoxList;
    if (sender == null) {
        throw new Exception("Sender is not a CheckBoxList");
    }

    for (int i = 0; i < cbl.Items.Count; i++)
    {
        if (cbl.Items[i].Selected)
        {
            //  Also, set a breakpoint here... are you hitting this line?
            selectedUsers += cbl.Items[i].Text;
        }
    }

另外,测试你是否进入选定项目的块...他们是否注册为选中,但没有收回文本?或者这些项目首先没有显示为选中状态?

答案 5 :(得分:0)

在尝试从中检索值之前,您需要确保您的checkboxlist具有数据绑定。

答案 6 :(得分:0)

试试这个: -

    foreach (ListItem li in cb_selectUser.Items)

   {
       //Your Code
   }

答案 7 :(得分:-2)

我有同样的问题。您必须按如下方式绑定CheckBoxList

if(!IsPostBack)
{
   //Bind your checkboxlist
}