[ 月別 | 分類別 ]

[ASP.NET][C#] データのIDを指定してそのデータがあるページでGridViewを開くのに試行錯誤した話

2008-11-11 00:42:22

パソコン・インターネット

最近やっとASP.NETを触りだしたんだけど、わからないことがやたら多くて困っている。

その1つが、タイトルにも書いたデータのIDを指定してそのデータがあるページでGridViewを開く方法がわからないというものなんだが・・・。

まず、GridViewでいきなり指定ページを開く方法だが、これはすぐにわかった。

GridViewを配置し、Page_Loadでページ番号を指定してみる。
この例だと、3ページ目が開かれる。
あとはQueryStringなどでページ番号を渡してやればOK。

protected void Page_Load(object sender, EventArgs e)
{
  GridView1.PageIndex = 2;
}

不思議なのは、この後で画面上でページを切り替えてもちゃんと動くこと。
なんでここで指定したページに変わらないのかが謎。
ちゃんと勉強しないとわからんかも。

続いて、最初の目的であるIDを指定してそのIDを持つデータがあるページを開くようにしてみる。
やり方だけど、QueryStringで渡されたIDを持つデータを、1つずつ調べていくことにした。
(相当原始的な方法かも。スマートな方法があるのかもしれないけど、勉強してないのでよくわからない。)

試行錯誤した揚句、以下のようになった。
なんか無理やりという感じがするが他に思いつかない。
(IDが入っている列の位置はCellsのインデックスで指定。)

protected void GridView1_PreRender(object sender, EventArgs e)
{
  string id = Request.QueryString["id"];

  if (id != null)
  {
   string act = Request.Path;
   int ind = act.LastIndexOf("/");
   if (ind >= 0)
   {
    act = act.Substring(ind + 1);
    form1.Action = act;
   }

   for (int i = 0; i < GridView1.PageCount; i++)
   {
    GridView1.PageIndex = i;
    for (int j = 0; j < GridView1.Rows.Count; j++)
    {
     string tempid = GridView1.Rows[j].Cells[1].Text;
     if (tempid.Equals(id))
     {
      return;
     }
    }
   }
   GridView1.PageIndex = 0;
  }
}

注意しないといけないのは、先のPage_LoadでGridViewのデータを参照してみても値が入っていないというとこ。
GridView1のPreRenderイベントを割り当てて、そこで参照してやる必要がある。
(PageのPreRenderでもいいかも。)

あと、form1.actionを設定しているところがあるが、単にファイル名だけにしたかっただけ。

なんかasp.netになったら便利になると思っていたが、なんだかお約束が多くて大変だな~。
aspのがよかったかも。