DataList Установить SelectedIndex из значения DataKey

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

Если страница должна быть повторно посещена одним и тем же пользователем в какой-то момент в будущем, выбранное значение ключа данных извлекается из БД. Я хотел бы использовать это значение ключа данных, чтобы выделить соответствующую строку в 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;
                  }
                 }

person Munklefish    schedule 27.08.2009    source источник
comment
Разве вы не должны использовать событие DataBound? сначала привяжите все, затем найдите предмет и выберите его в конце.   -  person hollystyles    schedule 27.08.2009
comment
Нет события DataBound с DataList.   -  person Munklefish    schedule 27.08.2009


Ответы (1)


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

  1. При условии, что PostBack является ложным
  2. Установите SelectedIndex
  3. Установите источник данных
  4. привязка данных

Вот пример:

  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 для кода цикла. Идея будет одинаковой для любого вашего фактического объекта источника данных.

person Ahmad Mageed    schedule 27.08.2009
comment
Отличный материал. Извините, что причиняю боль, но я больше не могу ясно мыслить. Что мне нужно сделать для 'var itemIndex = [индекс вышеуказанного элемента]; ' кусочек? - person Munklefish; 27.08.2009
comment
Вы бы перебирали свой DataTable или любой другой объект DataSource. Например, используйте цикл for и сопоставьте текущий элемент строки/столбца DataTable с сохраненным DataKey. Если он совпадает, то itemIndex будет текущим номером индекса цикла for. Я постараюсь отредактировать и добавить пример. - person Ahmad Mageed; 27.08.2009
comment
Обновлено с помощью переменной datakey и примера цикла for. Идея такая же, будь то DataTable, DataView, List и т.д. - person Ahmad Mageed; 27.08.2009
comment
Ахмад, спасибо за это. Я обновил свой вопрос, чтобы отразить, как я адаптировал ваш код. Однако я получаю сообщение об ошибке в VWE2008 с красной волнистой линией и битом '(dt.Rows.[cha_Key]'. В нем говорится, что метод перегрузки для DataDataRowCollection.this[int] имеет недопустимые аргументы. Есть идеи? - person Munklefish; 27.08.2009
comment
+1 - Ваш ответ был правильным, поэтому я проголосовал за вас и удалил свой. Я бы не стал отвечать, предоставляя информацию для кого-либо еще. - person CAbbott; 27.08.2009
comment
@Munklefish: попробуйте использовать dt.Rows[cha_Key] вместо dt.Rows.[cha_Key] (обратите внимание, что между строками и [cha_Key] нет точки) - person Ahmad Mageed; 27.08.2009
comment
Ахмад, это была просто опечатка. На самом деле нужно было добавить значение int для ссылки на строку, например: dt.Rows[i][cha_Key] Теперь все работает нормально СПАСИБО!!!!! - person Munklefish; 27.08.2009
comment
@CAbbott: спасибо. Как я сказал во вступительном абзаце, этот подход не обязательно неправильный (большинство других элементов управления следуют этому шаблону), и в статье хорошо объясняются эти два сценария. - person Ahmad Mageed; 27.08.2009
comment
@Munklefish: ах, хороший улов. Я обновлю свой код, чтобы отразить это. Рад, что у вас все заработало! - person Ahmad Mageed; 27.08.2009