Как я могу получить выбранные значения CheckBoxList, то, что у меня есть, похоже, не работает С#.NET/VisualWebPart

Я создаю CheckBoxList в файле класса и использую HTMLTextWriter для отображения элемента управления.

Я использую следующий код для хранения выбранных значений в строке:

string YrStr = "";
for (int i = 0; i < YrChkBox.Items.Count; i++)
{
    if (YrChkBox.Items[i].Selected)
    {
        YrStr += YrChkBox.Items[i].Value + ";"; 
    }
}

Я прошел через код, и он, похоже, не попадает внутрь оператора if, а выбранный атрибут значения каждый раз имеет значение false ... Кто-нибудь знает, как я могу это решить?

Я заполняю его, используя следующее:

 YrChkBox.Items.Add(new ListItem("Item 1", "Item1"));

person anpatel    schedule 01.03.2012    source источник
comment
этот код должен работать.. под каким событием вы разместили этот код, и действительно ли у вас есть значение YrChkBox.Items.Count..??   -  person MethodMan    schedule 02.03.2012
comment
По щелчку; ответ на оператор if всегда кажется ложным. Однако это в файле класса, будут ли к этому иметь какое-либо отношение PostBacks?   -  person anpatel    schedule 02.03.2012


Ответы (6)


На вашей странице ASPX у вас есть такой список:

    <asp:CheckBoxList ID="YrChkBox" runat="server" 
        onselectedindexchanged="YrChkBox_SelectedIndexChanged"></asp:CheckBoxList>
    <asp:Button ID="button" runat="server" Text="Submit" />

В вашем коде за страницей aspx.cs у вас есть это:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Populate the CheckBoxList items only when it's not a postback.
            YrChkBox.Items.Add(new ListItem("Item 1", "Item1"));
            YrChkBox.Items.Add(new ListItem("Item 2", "Item2"));
        }
    }

    protected void YrChkBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Create the list to store.
        List<String> YrStrList = new List<string>();
        // Loop through each item.
        foreach (ListItem item in YrChkBox.Items)
        {
            if (item.Selected)
            {
                // If the item is selected, add the value to the list.
                YrStrList.Add(item.Value);
            }
            else
            {
                // Item is not selected, do something else.
            }
        }
        // Join the string together using the ; delimiter.
        String YrStr = String.Join(";", YrStrList.ToArray());

        // Write to the page the value.
        Response.Write(String.Concat("Selected Items: ", YrStr));
    }

Убедитесь, что вы используете условие if (!IsPostBack) { }, потому что если вы загружаете его при каждом обновлении страницы, оно фактически уничтожает данные.

person Walk    schedule 01.03.2012
comment
У меня его вообще нет в разметке. У меня есть в текстовом редакторе. Дайте мне секунду, я вставлю свой код для этой части. - person anpatel; 02.03.2012
comment
Ах, я понимаю, что вы говорите, добавляйте выбранные значения в список по мере их выбора... Я попробую, хотя я беспокоюсь о перезагрузке страницы каждый раз, когда пользователь устанавливает флажок - person anpatel; 02.03.2012
comment
Вы можете удалить часть AutoPostBack=True со страницы ASPX, и она должна вести себя так же в событии обратной отправки из другого события, такого как нажатие кнопки. Это было просто для примера. - person Walk; 02.03.2012
comment
Кажется, я не могу добавить элемент управления на стороне сервера в программный код и добавить его рендеринг через HTMLTextWriter... какие-либо идеи о том, как я могу это сделать. Мне действительно нужно иметь возможность получить выбранные значения списка флажков, спасибо за вашу помощь +1 - person anpatel; 02.03.2012

Попробуйте что-то вроде этого:

foreach (ListItem listItem in YrChkBox.Items)
{
    if (listItem.Selected)
    { 
       //do some work 
    }
    else 
    { 
      //do something else 
    }
}
person MethodMan    schedule 01.03.2012
comment
@Kraze Именно то, что у меня есть прямо сейчас ... за исключением того, что у меня это в цикле for, я попробовал это с вашим синтаксисом, и да, на самом деле это то же самое, но мне больше нравится ваш синтаксис, поэтому я оставлю его, лол +1 - person anpatel; 02.03.2012
comment
Ах, я понимаю, что вы говорите, да, вы правы, я этого не делал. Я бы очень хотел, чтобы это помогло, хотя Т_Т, у меня такая же проблема. Я думаю, это потому, что моя кнопка не на стороне сервера. - person anpatel; 02.03.2012

флажок перечислить выбранные значения с разделителем

 string items = string.Empty;
        foreach (ListItem i in CheckBoxList1.Items)
        {
            if (i.Selected == true)
            {
                items += i.Text + ",";
            }
        }
        Response.Write("selected items"+ items);
person kavitha Reddy    schedule 10.12.2013

Элегантным способом реализации этого было бы создание метода расширения, например:

public static class Extensions
{
    public static List<string> GetSelectedItems(this CheckBoxList cbl)
    {
        var result = new List<string>();

        foreach (ListItem item in cbl.Items)
            if (item.Selected)
                result.Add(item.Value);

        return result;
    }
}

Затем я могу использовать что-то вроде этого, чтобы составить строку, в которой все значения будут разделены знаком ';':

string.Join(";", cbl.GetSelectedItems());
person Fred Mauroy    schedule 06.06.2016

// Page.aspx //

// To count checklist item

  int a = ChkMonth.Items.Count;
        int count = 0;

        for (var i = 0; i < a; i++)
        {
            if (ChkMonth.Items[i].Selected == true)
            {
                count++;
            }
        }

// Страница. aspx.cs //

  // To access checkbox list item's value //
   string YrStrList = "";
        foreach (ListItem listItem in ChkMonth.Items)
        {
            if (listItem.Selected)
            {
                YrStrList = YrStrList + "'" + listItem.Value + "'" + ",";
            }

        }

        sMonthStr = YrStrList.ToString();
person priya uthaya    schedule 29.05.2014

// aspx.cs

// Загружаем выбранные элементы CheckBoxList в ListBox

    int status = 1;
    foreach (ListItem  s in chklstStates.Items  )
    {
        if (s.Selected == true)
        {
            if (ListBox1.Items.Count == 0)
            {
                ListBox1.Items.Add(s.Text);

            }
            else
            {
                foreach (ListItem list in ListBox1.Items)
                {
                    if (list.Text == s.Text)
                    {
                        status = status * 0;

                    }
                    else
                    {
                        status = status * 1;
                    }
                }
                if (status == 0)
                { }
               else
                {
                    ListBox1.Items.Add(s.Text);
                }
                status = 1;
            }
        }
    }
}
person Jomon John    schedule 21.07.2014