簡體   English   中英

C#清單清單

[英]C# Checkboxlist

好的,所以我有一個帶有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();

說的索引超出范圍。 然而,當我調試時,數字似乎已正確分配到列表中。

這是您需要的嗎?

<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;        
}

在這種情況下,您不需要選擇,但是如果仍然需要填充它,則不需要foreach循環

List<int> Chosen = new List<int>();
Chosen.AddRange(Numbers.Items.Cast<ListItem>().Where(i => i.Selected).Select(x => Numbers.Items.IndexOf(x) + 1));

嘗試使用:

TextBox1.Text = i.ToString();

此外,這只會顯示最后選擇的項目。 如果選擇了多個,則必須將所有連接起來,然后分配給TextBox1.Text。 或使用此:

TextBox1.Text += i.ToString() + " ";

假設這是您的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;

  }

根據我的理解,這就是您所解釋的

編輯和測試

而不是使用TextBox1.Text = Chosen[i].ToString(); 采用

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

問題在於,當您使用foreach時,i的值實際上是選擇列表的實際元素的值,而不是索引。

您編寫的方式在for循環中運作良好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM