使用索引而不是值从列表框中获取选定的项目

Getting selected items from a listbox using the index instead of value

当我填充一个列表框时,我会做这样的事情:

SqlDataAdapter adapter = new SqlDataAdapter("Select [DDLValue], [StoredValue] 
from [tmpDropdowns] WHERE DDLName = 'ddlHobbies' ORDER BY [SortOrder] ASC", conn);

adapter.Fill(DDLHobbies);

Hobbies.DataSource = DDLHobbies;
Hobbies.DataTextField = "DDLValue";
Hobbies.DataValueField = "StoredValue";
Hobbies.DataBind();

当我想取回物品时,我会这样做:

var selectedHobbies = Hobbies.Items.Cast<ListItem>().Where(item => item.Selected);
string strHobbies = String.Join(",", selectedHobbies).TrimEnd();

不幸的是,这给了我这样的东西:

strHobbies = "Fishing,Skiing,Pool,Birdwatching"

我说 "unfortunately" 因为我的 objective 是在 SQL 字符串的 "WHERE" 子句中使用 strHobbies。所以,我的 SQL 字符串应该类似于:

SELECT * FROM MyTable WHERE Hobbies in (strHobbies)

所以,这个问题有 2 个部分。

  1. 如何更改 "var selectedHobbies" 行以引入 StoredValue 而不是 DDLValue

  2. 如何重组我的 "string strHobbies" 行,以便它在每个项目周围加上双引号,以便我可以在 'IN' 子句中使用它?

我想我可能希望我的最终 SQL 字符串看起来更像:

SELECT * FROM MyTable WHERE Hobbies in ("2", "5", "6", "9")

编辑:

我改变了一件事:

List<string> selectedHobbies = Hobbies.Items.Cast<ListItem>()
    .Where(item => item.Selected).Select(item => item.Value).ToList();

string strHobbies = String.Join(",", selectedHobbies).TrimEnd();

当我将鼠标悬停在 selectedHobbies 上时,这会给我 StoredValue 而不是 DDLValue,但是当我在 Immediate window 中键入“?strHobbies”时,它会显示 "The name strHobbies does not exist in the current context"。所以,我把#1 弄下来了,如果有人能帮助我解决#2,我将不胜感激。

对于 #2,您需要在每个值周围加上单引号,而不是双引号。 (假设 Hobbies 不是数据库中的整数)

string strHobbies = String.Join("','", selectedHobbies).TrimEnd();

您可以将它们放在 Select 中,就像这样

List<string> selectedHobbies = Hobbies.Items.Cast<ListItem>()
.Where(item => item.Selected).Select(item => "'" + item.Value + "'").ToList();