私はこのようなCheckBoxListを持っています:
<asp:CheckBoxList ID="CBLGold" runat="server" CssClass="cbl">
<asp:ListItem Value="TGJU"> TG </asp:ListItem>
<asp:ListItem Value="GOLDOZ"> Gold </asp:ListItem>
<asp:ListItem Value="SILVEROZ"> Silver </asp:ListItem>
<asp:ListItem Value="NERKH"> NE </asp:ListItem>
<asp:ListItem Value="TALA"> Tala </asp:ListItem>
<asp:ListItem Value="YARAN"> Sekeh </asp:ListItem>
</asp:CheckBoxList>
今度はforeachを使用してこのCheckBoxListから選択した項目の値を取得し、その値をリストに入れます。
注:コードは短いほうがいいでしょう。
私はコードを短くすることを好むことに注意してください。
List<ListItem> selected = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.ToList();
または単純なforeach
を使って:
List<ListItem> selected = new List<ListItem>();
foreach (ListItem item in CBLGold.Items)
if (item.Selected) selected.Add(item);
ListItem.Value
だけが欲しいのなら:
List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
foreach (ListItem item in CBLGold.Items)
{
if (item.Selected)
{
string selectedValue = item.Value;
}
}
こんにちは、あなたは常に選択されたリストアイテムを得るために少しLINQを使うことができて、そしてあなたが結果であなたが望むものをする:
var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected);
// work with selected...
ここの提案からのスーツに従って、 System.Web.UI.WebControls.ListControl
を継承する任意の型に対してLINQを使用して選択した項目のリストを返す拡張メソッドを追加しました。
すべてのListControl
オブジェクトは、 Items
型の ListItemCollection
プロパティを持ちます。 ListItemCollection
は、 ListItems
のコレクションを公開し、それぞれコレクションにSelected
プロパティがあります。
public static IEnumerable<ListItem> GetSelectedItems(this ListControl checkBoxList)
{
return from ListItem li in checkBoxList.Items where li.Selected select li;
}
<Extension()> _
Public Function GetSelectedItems(ByVal checkBoxList As ListControl) As IEnumerable(Of ListItem)
Return From li As ListItem In checkBoxList.Items Where li.Selected
End Function
それなら、どちらの言語でもこのように使います。
myCheckBoxList.GetSelectedItems()
代わりにList<int>
を取得する@Tim Schmelterを補完するには、
List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.Select(int.Parse)
.ToList();
このスレッドは、多くの良い例で、はるかに最高でした。
私が遭遇したことの一つは私のためにはうまくいかなかったし、私はデバッグに何時間も費やした、私は自分のチェックボックスリストから選択された値を得た理由それは私のマスターページのせいでしたか?それとも、AjaxControlkitでModalPopupを使用していたのですか、それともデータベースクエリからチェックリストを作成するときに正しい方法を使用したのでしょうか。
私はついに私がこれのすべての中で重要な部分を逃したことに気付きました...
私のコードビハインドで私は私のPage_Loadイベントで私のsql dbからチェックボックスリストを作成し、私のbutton_clickイベントですべてのチェックボックスリストから値を得ました。
だから私はいくつかのチェックボックスをチェックしてから私のボタンをクリックしたときに起こった最初の事は私のpage_loadイベントがチェックボックス値を実行したときにチェックボックスを持っていなかったということです。 if(!this.IsPostBack)
私の誤解とこの答えが、一部のデバッグ時間を最小限に抑えるのに役立つことを願っています。
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
// db query and create checkboxlist and other
SqlConnection dbConn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
string query;
try
{
query = "SELECT [name], [mail] FROM [users]";
dbConn.Open();
SqlDataAdapter da = new SqlDataAdapter(query, dbConn);
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count != 0)
{
checkboxlist1.DataSource = ds;
checkboxlist1.DataTextField = "name";
checkboxlist1.DataValueField = "mail";
checkboxlist1.DataBind();
}
else
{
Response.Write("No Results found");
}
}
catch (Exception ex)
{
Response.Write("<br>" + ex);
}
finally
{
dbConn.Close();
}
}
}
protected void btnSend_Click(object sender, EventArgs e)
{
string strChkBox = string.Empty;
foreach (ListItem li in checkboxlist1.Value)
{
if (li.Selected == true)
{
strChkBox += li.Value + "; ";
// use only strChkBox += li + ", "; if you want the name of each checkbox checked rather then it's value.
}
}
Response.Write(strChkBox);
}
そしてその出力は期待通りのもので、私がmailsend関数で使うためのセミコロン区切りリストです。
[email protected]; [email protected]; [email protected]
小さな問題に対する長い答え私はこれで専門家から遠く離れていて、これより良い解決策があることを知っていることに注意してください、しかしそれはそれを助けてくれるかもしれません。
List<string> values =new list<string>();
foreach(ListItem Item in ChkList.Item)
{
if(Item.Selected)
values.Add(item.Value);
}
string s= string.Empty
for (int i = 0; i < Chkboxlist.Items.Count; i++)
{
if (Chkboxlist.Items[i].Selected)
{
s+= Chkboxlist.Items[i].Value + ";";
}
}