Как вернуть выбранные элементы из элемента управления checkboxlist в asp.net

2

Я пытаюсь вернуть в строке выбранные элементы из динамически связанного элемента управления флажком без везения. Я надеюсь, что кто-то может помочь. В моем коде за файлом я склоняюсь к классу, называемому пользователями, и создаю datatable. Затем я привязываю таблицу данных к элементу управления 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 как listitems.

 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 ответов

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[] {',', ' '});
        }
  • 0
    При проверке этого я возвращаю весь список в список. В вашем примере вы возвращаете 10 элементов в списке, но если выбран только один элемент-флажок, строка (-ы) по-прежнему отображает все 10 элементов.
  • 0
    извини дорогой @randyc. Я обновил выражение Linq предложением Where , чтобы получать только выбранные элементы.
Показать ещё 2 комментария
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();
2

1- Загрузите Jquery.json.js и добавьте его в свое мнение как refrence:

<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 4- в контроллере вы можете получить значения, добавив массив в качестве аргумента:

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

Я искал слишком много, но, видимо, это единственное решение. Пожалуйста, дайте мне знать, если вы найдете для него лучшее решение.

2

Вы уверены, что populateUserList() вызывается только один раз? (т.е. не на обратной стороне). Если он дважды вызван, выбранная коллекция элементов будет пустой.

protected void Page_Load(object sender, EventArgs e)
{
  if(!IsPostBack)
  {
    populateUserList();
  }
}
  • 0
    Спасибо, Адам. Да, я проверяю обратную передачу как при загрузке страницы, так и внутри самого метода. Этот метод вызывается только один раз.
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;
        }
    }

Кроме того, проверьте, попадаете ли вы в блок для выбранных элементов... регистрируются ли они как выбранные, но не получают текст обратно? Или элементы не отображаются в первую очередь?

  • 0
    Джеймс, я проверил это, и оно доходило до критической точки, однако я думаю, что есть что-то в том, как элементы создаются динамически. Когда я проверяю это, он продолжает возвращать нулевое значение.
0

Попробуйте следующее: -

    foreach (ListItem li in cb_selectUser.Items)

   {
       //Your Code
   }
0

Вам нужно убедиться, что ваш checkboxlist имеет привязку к базе данных, прежде чем пытаться извлечь из нее значения.

-1

У меня была такая же проблема. Вы должны привязать CheckBoxList следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню