2013-06-13 3 views
0

У меня есть список с данными из SQL DB. При загрузке страницы я хочу выбрать несколько элементов в соответствии с данными из моего запроса. Это не дает мне никаких ошибок, а также не работает. Вот код.Почему Listbox Множественный выбор не работает при загрузке страницы?

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

Вы гарантировали, что ваш код запускается ПОСЛЕ ваш ListBox - DataBound. Из того, что я вижу, кажется сомнительным – jbl

ответ

1

Удалить этот товар избирательный кодекс с вашего PageLoad и поместить его в другой метод (скажем SelectItems) Где-то на вашей странице, вы должны иметь один или несколько ListBox1.DataBind(); вызовов. Положите вызов SelectItems сразу после этих вызовов ListBox1.DataBind();.

Кроме того, я предполагаю, что ваш код может быть написан как это с помощью 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" для ListBox.

+1

Но OP даже установил его программно, как вы можете видеть в его коде: 'ListBox1.SelectionMode = ListSelectionMode.Multiple;' –

+0

oh sorry, я этого не видел. –