2009-08-27 5 views
0

У меня есть DataList, отображаемый на странице (Asp.Net3.5), которую пользователь может выбрать. Значение datakey выбранной строки затем сохраняется в базе данных.DataList Set SelectedIndex from DataKey Value

Если страница должна быть пересмотрена одним и тем же пользователем в какой-то момент в будущем, выбранное значение datakey будет восстановлено из БД. Я хотел бы использовать это значение datakey, чтобы выделить соответствующую строку в DataList.

Как я могу установить соответствующий SelectedIndex из списка DataList из этого значения DataKey?

Я пробовал следующее:

 protected void dlCampChars_DataBinding(object sender, EventArgs e) 
{ 
    for (int i = 0; i < dlCampChars.Items.Count; i++) 
{ 
    // Ignore values that cannot be cast as integer. 
    try 
    { 
     if (dlCampChars.DataKeys[i].ToString() == lSelection.ToString()) 
     { 
      Label28.Text = i + ""; 
      dlCampChars.SelectedIndex = i + 1; 
     } 

    } 
    catch { } 
    } 
} 

Если я установить его в ItemDataBinding обновление SelectedIndex производится после того, как DL был связан и не имеет никакого эффекта. Есть идеи??

Благодаря

ОБНОВЛЕНО КОД

    // if stored DataKey exists loop through DataTable 
       // looking for the index of the item matching the DataKey 
       int itemIndex = 0; 
       for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        // check the appropriate "DataKey" column name of the current row 
        if (dt.Rows[i]["cha_Key"].ToString() == lSelection) 
        { 
        // match found, set index and break out of loop 
        itemIndex = i; 
        break; 
        } 
       } 
+0

Не следует ли использовать событие DataBound? сначала свяжите все, затем найдите элемент и выберите его в конце. –

+0

В DataList отсутствует событие DataBound. – Munklefish

ответ

2

Кажется, вещи немного назад в DataList земли, в зависимости от того, когда элемент оказывается и какой шаблон он находится в (проверить 1-й ссылке ниже для пояснения). Подход ItemDataBound действителен, но иногда он немного причудливый, как описано в этой статье. В случае, когда вы описываете, я считаю, что будет работать второй подход, где вы можете установить свойство SelectedIndex до вызов DataBind(). Шаги:

  1. Предоставлено PostBack ложна
  2. Установите SelectedIndex
  3. Установите DataSource
  4. DataBind

Вот пример:

void Page_Load(Object sender, EventArgs e) 
    { 
    // Load sample data only once, when the page is first loaded. 
    if (!IsPostBack) 
    { 
     dlCampChars.DataSource = CreateDataSource(); 
     dlCampChars.DataBind(); 
    } 
    } 

private DataTable CreateDataSource() 
{ 
    // however you get your data and whatever the resulting object is 
    // for example: DataTable, DataView, etc. 
    DataTable dt = [relevant code here]; 

    // retrieve the user's stored DataKey 
    string datakey = [retrieved datakey value from DB]; 

    // if stored DataKey exists loop through DataTable 
    // looking for the index of the item matching the DataKey 
    int itemIndex = 0; 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
    // check the appropriate "DataKey" column name of the current row 
    if (dt.Rows[i]["DataKey"].ToString() == datakey) 
    { 
     // match found, set index and break out of loop 
     itemIndex = i; 
     break; 
    } 
    } 

    // set SelectedIndex 
    dlCampChars.SelectedIndex = itemIndex; 

    // now return the DataSource (ie. DataTable etc.) 
    return dt; 
} 

Вы можете найти эти статьи полезны:

EDIT: добавлен DataTable для кода цикла. Идея была бы такой же, каков бы ни был ваш фактический объект источника данных.

+0

Отличный материал. Извините, но я не могу больше думать. Что мне нужно сделать для «var itemIndex = [index of above item]; 'бит? – Munklefish

+0

Вы прокрутите свой DataTable или вне зависимости от вашего объекта DataSource. Например, используйте цикл for и сопоставьте текущий элемент строки/столбца DataTable с сохраненным DataKey. Если он совпадает, то itemIndex будет текущим номером индекса цикла. Я попытаюсь отредактировать и добавить пример. –

+0

Это было бы здорово. – Munklefish