DataList Set SelectedIndex из значения DataKey - PullRequest
0 голосов
/ 27 августа 2009

У меня есть DataList, отображаемый на странице (Asp.Net3.5), из которой пользователь может выбирать. Затем значение 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;
                  }
                 }

1 Ответ

2 голосов
/ 27 августа 2009

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

  1. При условии, что PostBack ложен
  2. Установить SelectedIndex
  3. Установить источник данных
  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;
}

Вам могут пригодиться эти статьи:

РЕДАКТИРОВАТЬ: добавлен DataTable для кода цикла. Идея была бы одинаковой для любого фактического объекта источника данных.

...