2012-01-18 13 views
0

これで、チェックボックスにn個のチェックボックスが付いています。ボックスにチェックを入れるたびに、その番号がリストに追加されます(選択したもの)。チェックボックスをオフにすると、リストから削除します。それから私がボタンを押すと、リストをテキストボックスに表示したい。ここに私のコードは次のとおりです。それは、私はそれがしたいように動作しません言うことC#チェックボックスリスト

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(); 

セイリングインデックスが範囲外です。しかし、私が数値をデバッグするとき、リストに適切に割り当てられているようです。

答えて

3

これは必要なのですか?あなたが選択し必要はありませんが、あなたはまだそれを移入する必要がある場合、あなたは

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

をテストしました。私は家に帰るときこの解決策を見ていきます。 –

2

は、使用してみてください:

TextBox1.Text = i.ToString(); 

また、これが唯一の最後の項目が選択表示されます。倍数を選択した場合は、すべてを連結してからTextBox1.Textに割り当てる必要があります。またはこれを使用してください:

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

代わりのTextBox1.Text = Chosen[i].ToString(); 使用

TextBox1.Text = String.Empty; 
foreach (var i in Chosen) 
{ 
    TextBox1.Text += i.ToString(); 
} 
を使用してのforeachループを必要といけない。この場合

<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を使用するとき、iの値は実際にはインデックスではなく、選択リストの実際の要素の値であるということです。あなたが書いた

方法は、ループのためにうまく機能している:

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

が、これはあなたの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; 

    } 

これはあなたが私の理解に従って説明したことを行います

編集され、はい、私はアプリケーションでの使用のためにそれを移入する必要があります

関連する問題