C# 为什么Listbox多重选择在页面加载时不起作用?

C# 为什么Listbox多重选择在页面加载时不起作用?,c#,asp.net,.net,C#,Asp.net,.net,我有一个包含SQL DB数据的列表框。在页面加载时,我想根据查询结果中的数据选择多个项目。它不会给我任何错误,也不会工作。 这是代码 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack){ DataTable userinfo = AppDataAccess.retrieveUsers(id); foreach (DataRow ro

我有一个包含SQL DB数据的列表框。在页面加载时,我想根据查询结果中的数据选择多个项目。它不会给我任何错误,也不会工作。 这是代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack){

             DataTable userinfo = AppDataAccess.retrieveUsers(id);
                   foreach (DataRow row in userinfo.Rows)
            {
              string group = row["GroupNumber"].ToString();
                List<string> val = group.Split(',').ToList();

             if (val != null)
                    {
                        ListBox1.SelectionMode = ListSelectionMode.Multiple;

                        //loop to select multiple items
                        foreach (string per in val)
                        {
                            if (ListBox1.Items.FindByValue(per.ToString()) != null)
                            {
                                ListBox1.Items.FindByValue(per.ToString()).Selected = true;
                            }
                        }
                    }
             }



     }
 }
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack){
DataTable userinfo=AppDataAccess.retrieveUsers(id);
foreach(userinfo.Rows中的DataRow行)
{
字符串组=行[“GroupNumber”]。ToString();
List val=group.Split(',').ToList();
如果(val!=null)
{
ListBox1.SelectionMode=ListSelectionMode.Multiple;
//循环以选择多个项目
foreach(字符串每值)
{
if(ListBox1.Items.FindByValue(per.ToString())!=null)
{
ListBox1.Items.FindByValue(per.ToString()).Selected=true;
}
}
}
}
}
}

它没有给我任何错误,也没有选择任何项目。我尝试了几种方法,但仍然不起作用。有什么想法吗?

您可以用另一种方法尝试,循环所有
列表项
,并设置每个
选定的属性:

foreach(DataRow row in userinfo.Rows)
{
    string group = row.Field<String>("GroupNumber");
    string[] vals = group.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    foreach(ListItem item in ListBox1.Items)
    {
        item.Selected = vals.Contains(item.Value);
    }
}
foreach(userinfo.Rows中的DataRow行)
{
字符串组=行字段(“GroupNumber”);
string[]vals=group.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
foreach(ListBox1.Items中的ListItem项)
{
所选项目=VAL.Contains(项目值);
}
}

您可以尝试另一种方法,循环所有
列表项
,并设置每个
选定的
属性:

foreach(DataRow row in userinfo.Rows)
{
    string group = row.Field<String>("GroupNumber");
    string[] vals = group.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    foreach(ListItem item in ListBox1.Items)
    {
        item.Selected = vals.Contains(item.Value);
    }
}
foreach(userinfo.Rows中的DataRow行)
{
字符串组=行字段(“GroupNumber”);
string[]vals=group.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
foreach(ListBox1.Items中的ListItem项)
{
所选项目=VAL.Contains(项目值);
}
}

为列表框设置
SelectionMode=“Multiple”

为列表框设置
SelectionMode=“Multiple”

从页面加载中删除此项目选择代码,并将其放入另一种方法(例如
SelectItems
) 在页面的某个地方,您应该有一个或多个
ListBox1.DataBind()呼叫。
在这些
ListBox1.DataBind()之后调用SelectItems呼叫

另外,我猜您的代码可以使用Linq这样编写

public void SelectItems()
{
 ListBox1.SelectionMode = ListSelectionMode.Multiple;
 var userinfos = AppDataAccess.retrieveUsers(id);

 var val = userInfos.Rows.SelectMany(r=>r["GroupNumber"].ToString().Split(','))
    .Distinct().ToList()

  //loop to select multiple items // could also be converted to Linq. Not sure it would be useful
  foreach (string per in val)
      {
       if (ListBox1.Items.FindByValue(per.ToString()) != null)
          {
           ListBox1.Items.FindByValue(per.ToString()).Selected = true;
           }
        }

}

从页面加载中删除此项目选择代码,并将其放入另一种方法(例如
SelectItems
) 在页面的某个地方,您应该有一个或多个
ListBox1.DataBind()呼叫。
在这些
ListBox1.DataBind()之后调用SelectItems呼叫

另外,我猜您的代码可以使用Linq这样编写

public void SelectItems()
{
 ListBox1.SelectionMode = ListSelectionMode.Multiple;
 var userinfos = AppDataAccess.retrieveUsers(id);

 var val = userInfos.Rows.SelectMany(r=>r["GroupNumber"].ToString().Split(','))
    .Distinct().ToList()

  //loop to select multiple items // could also be converted to Linq. Not sure it would be useful
  foreach (string per in val)
      {
       if (ListBox1.Items.FindByValue(per.ToString()) != null)
          {
           ListBox1.Items.FindByValue(per.ToString()).Selected = true;
           }
        }

}

如何填写
列表框1.Items
集合?@Knaģ它与数据库表中的数据绑定。您是否确保代码在ListBox数据绑定后运行。依我看,似乎doubtfull@jbl那是我也不确定的。如果是问题,有什么替代方法来解决?我刚刚跳入CFML,PHP专区到.Net。如何填充
列表框1.Items
集合?@Knaģ它与数据库表中的数据绑定。您是否确保代码在ListBox数据绑定后运行。依我看,似乎doubtfull@jbl那是我也不确定的。如果是问题,有什么替代方法来解决?我刚刚跳转到CFML,PHP专区到.Net,但OP甚至以编程方式设置了它,正如您在他的代码中看到的:
ListBox1.SelectionMode=ListSelectionMode.Multiple哦,对不起,我没有看到。但OP甚至已经用编程方式设置了它,正如您在他的代码中看到的:
ListBox1.SelectionMode=ListSelectionMode.Multiple