0

我在(Asp.Net3.5)页面上显示了一个 DataList,用户可以从中进行选择。然后将所选行的 datakey 值存储在数据库中。

如果同一用户在未来某个时间点重新访问该页面,则从数据库中检索选定的数据键值。我想使用这个 datakey 值来突出显示 DataList 中的相应行。

如何从此 DataKey 值设置 DataList 的适当 SelectedIndex?

我尝试了以下方法;

      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;
                  }
                 }
4

1 回答 1

2

在 DataList 领域,情况似乎有些倒退,具体取决于项目的呈现时间和它所在的模板(查看下面的第一个链接以获取解释)。ItemDataBound 方法是有效的,但有时像那篇文章中描述的那样有点古怪。在您描述的情况下,我相信第二种方法会起作用,您可以在调用 DataBind()之前设置 SelectedIndex 属性。步骤是:

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

您可能会发现这些文章很有帮助:

编辑:为循环代码添加了 DataTable。无论您的实际数据源对象是什么,这个想法都是一样的。

于 2009-08-27T15:05:42.183 回答