C # Checkboxlist - PullRequest
       2

C # Checkboxlist

0 голосов
/ 18 января 2012

Хорошо, у меня есть список флажков с n флажками. Каждый раз, когда я ставлю флажок, я хочу, чтобы этот номер был добавлен в список (выбранный). Когда флажок снят, я хочу удалить его из списка. Затем, когда я нажимаю кнопку, я хочу отобразить список в текстовом поле. Вот мой код:

public partial class _Default : System.Web.UI.Page
{
    List<int> Chosen = new List<int>();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["Chosen"] == null)
        {
            Session["Chosen"] = new List<int>();
        } 

        Chosen = (List<int>)Session["Chosen"];

        for (int i = 0; i < Numbers.Items.Count; i++)
        {
            if (Numbers.Items[i].Selected) { Chosen.Add(i + 1); }
            else { Chosen.Remove(i + 1); }
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        foreach (var i in Chosen)
        {
            TextBox1.Text = Chosen[i].ToString();
        }
    }
}

Излишне говорить, что это не работает так, как я хочу. Когда я выбираю 1 и нажимаю кнопку, он записывает 1 в поле, но если я отменяю выбор и нажимаю кнопку, он оставляет 1 там. Также, если я выберу любое число, кроме 1, я получаю сообщение об ошибке в этой строке:

TextBox1.Text = Chosen[i].ToString();

Индекс высказывания вне диапазона. Тем не менее, когда я отлаживаю, числа, кажется, распределяются по списку должным образом.

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Это то, что вам нужно?

<asp:TextBox ID="textBox1" runat="server">
</asp:TextBox>
<asp:CheckBoxList ID="Numbers" runat="server" 
                   OnSelectedIndexChanged="UpdateCheckBoxex" AutoPostBack="true">
    <asp:ListItem Text="One" Value="One" />
    <asp:ListItem Text="Two" Value="Two" />
    <asp:ListItem Text="Three" Value="Three" />
    <asp:ListItem Text="Four" Value="Four" />
</asp:CheckBoxList>


protected void UpdateCheckBoxex(object sender, EventArgs e)
{
    string s = string.Empty;
    new List<ListItem>(Numbers.Items.Cast<ListItem>().Where(i => i.Selected)).ForEach(x => s += string.Format("{0}, ", x.Text));
    textBox1.Text = s;        
}

В этом случае вам не нужен Chosen, но если вам все еще нужно его заполнить, вам не нужен цикл foreach

List<int> Chosen = new List<int>();
Chosen.AddRange(Numbers.Items.Cast<ListItem>().Where(i => i.Selected).Select(x => Numbers.Items.IndexOf(x) + 1));
2 голосов
/ 18 января 2012

Попробуйте использовать:

TextBox1.Text = i.ToString();

Кроме того, будет отображаться только последний выбранный элемент.Если вы выбрали несколько кратных, вам нужно будет объединить все, а затем присвоить TextBox1.Text.Или используйте это:

TextBox1.Text += i.ToString() + " ";
1 голос
/ 18 января 2012

Предположим, это ваш CheckBoxList

<asp:CheckBoxList ID="Numbers" runat="server" AutoPostBack="True" 
        onselectedindexchanged="Numbers_SelectedIndexChanged">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>2</asp:ListItem>
        <asp:ListItem>3</asp:ListItem>
        <asp:ListItem>4</asp:ListItem>
        <asp:ListItem>5</asp:ListItem>
    </asp:CheckBoxList>

Код события: Отредактировано

 protected void Numbers_SelectedIndexChanged(object sender, EventArgs e)
{
    List<int> Chosen = new List<int>();
  if (Session["Chosen"] == null)
    {
        Session["Chosen"] = new List<int>();
    } 
    Chosen = (List<int>)Session["Chosen"];


    foreach (ListItem it in Numbers.Items)
        if (it.Selected)
        {
            if (!Chosen.Contains(Convert.ToInt32(it.Text)))
                Chosen.Add(Convert.ToInt32(it.Text));
        }
        else if (Chosen.Contains(Convert.ToInt32(it.Text)))
                Chosen.Remove(Convert.ToInt32(it.Text));
    TextBox5.Text="";
    foreach (int n in Chosen)
        TextBox5.Text +=  n.ToString() + " , ";

    Session["Chosen"] = Chosen;

  }

Это делает то, что вы объяснили согласно моему пониманию

Отредактировано и протестировано

0 голосов
/ 18 января 2012

Вместо использования TextBox1.Text = Chosen[i].ToString(); использовать

TextBox1.Text = String.Empty;
foreach (var i in Chosen)
{
   TextBox1.Text += i.ToString();
}

Проблема в том, что когда вы используете foreach, значение i фактически является значением фактического элемента списка Chosen, а не индекса.

То, как вы написали, хорошо работает в цикле for:

    for (int i = 0; i < Chosen.Count; i++)
    {
        TextBox1.Text += Chosen[i].ToString();
    }
...