DataList从DataKey Value设置SelectedIndex

时间:2009-08-27 14:21:03

标签: c# asp.net asp.net-3.5 datalist selectedindex

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

如果同一用户在将来的某个时间点重新访问该页面,则从DB中检索所选的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中设置它,则在DL绑定后生成SelectedIndex更新并且无效。任何想法??

由于

更新代码

                    // 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 个答案:

答案 0 :(得分:2)

看起来DataList中的东西有点倒退,具体取决于项目的呈现时间以及它所在的模板(请参阅下面的第一个链接以获得解释)。 ItemDataBound方法是有效的,但有时候有点古怪,如该文章所述。在您描述的情况下,我相信第二种方法可行,您可以在调用DataBind()之前设置SelectedIndex属性。步骤是:

  1. 提供的PostBack为假
  2. 设置SelectedIndex
  3. 设置DataSource
  4. 的DataBind
  5. 以下是一个例子:

      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。无论你的实际数据源对象是什么,这个想法都是一样的。