2013-06-13 48 views
0

我有一个列表框与来自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; 
          } 
         } 
        } 
      } 



    } 
} 

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

+1

你怎么填'ListBox1.Items'收藏? –

+0

@Knaģis它与数据库表中的数据绑定。 Atrh

+0

您确定您的代码在AFTER后运行你的ListBox是DataBound。从我所看到的情况来看,似乎有所怀疑 – jbl

回答

1

从您的PageLoad中删除这些项目的选举代码,并将其置于另一种方法(如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; 
      } 
     } 

}

+0

谢谢......它的工作原理.. – Atrh

+0

@Atrh thx为后续行动。那么你可以接受答案 – jbl

2

你可以尝试它的其他方式,循环中的所有ListItems并设置每个Selected属性:

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); 
    } 
} 
0

设置SelectionMode="Multiple"的列表框。

+1

但是OP甚至可以通过编程来设置它,就像你在他的代码中看到的那样:'ListBox1.SelectionMode = ListSelectionMode.Multiple;' –

+0

对不起,我还没有看到。 –

相关问题