0

ユーザーが選択できる(Asp.Net3.5)ページにDataListを表示しています。次に、選択した行のデータキー値がデータベースに格納されます。

将来のある時点で同じユーザーがページに再度アクセスする必要がある場合は、選択されたデータキーの値が DB から取得されます。この 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;
                  }
                 }
4

1 に答える 1

2

アイテムがいつレンダリングされ、どのテンプレートに含まれているかによって、DataList ランドでは物事が少し逆になっているようです (説明については、以下の最初のリンクを参照してください)。ItemDataBound アプローチは有効ですが、その記事で説明されているように、少し風変わりな場合があります。あなたが説明した場合、DataBind()への呼び出しの前にSelectedIndex プロパティを設定できる 2 番目のアプローチが機能すると思います。手順は次のとおりです。

  1. PostBack が false の場合
  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 に答える