[英]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.