QA@IT

asp.netで簡単なアプリを作成しています。gridviewで表示した表のCellの値を取得する方法を教えてください。

10627 PV

vs2012,c#,win8で開発しています。
ページをLoad時に下のコードでgridviewに表を作成しています。

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("記事", typeof(string)));
var db = new DataClasses1DataContext(ss);

   var query = from n in db.記事
               select n;
            foreach (var m in query)
            {
                DataRow row = dt.NewRow();
                row["記事"] = "・" + m.記事タイトル.ToString();

                dt.Rows.Add(row);
            }


            this.GridView1.DataSource = dt;
            this.GridView1.DataBind(); 

gridviewで作成された表の中にあるCellをクリックすると下のコードでページに飛ぶように設定しました。

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {

   string Location = ResolveUrl("記事詳細投稿.aspx");
   e.Row.Attributes["onClick"] = string.Format("javascript:window.location='{0}';", Location);
   e.Row.Style["cursor"] = "pointer";
  }

ここで、質問です。griewviewで作成された表をクリック時にクリックしたCellの値を取得したいのですが、どのように書いたらよいのでしょうか。
上のコードに

string dd = GridView1.SelectedDataKey.Values[0].ToString();

のコードを記載したのが下のコードになります。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {

   string Location = ResolveUrl("記事詳細投稿.aspx");
   e.Row.Attributes["onClick"] = string.Format("javascript:window.location='{0}';", Location);
   e.Row.Style["cursor"] = "pointer";

   string dd = GridView1.SelectedDataKey.Values[0].ToString();
   //ここでcellの値が取得できるのでは。
  }

これを実行すると、DataKeyNamesのプロパティを設定してくださいと表示されました。
そこで、
.csに

public virtual string[] DataKeyNames { get; set; }

.aspxに

 <asp:GridView ID="GridView1" runat="server" ShowHeader="False" GridLines="None" OnRowDataBound="GridView1_RowDataBound" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" DataKeyNames="記事">
    ↑
//ここに設定
</asp:GridView>

という感じで設定してみたのですが、うまくいきません。どのようにすればいいのか教えてください。お願いします。

  • 質問する際には、必ずご自分の環境(ASP.NET, IIS, DB サーバーなどの種類・バージョン、使用しているブラウザ、開発サーバー/IIS Express/IIS 何を使っているかなどの情報)を書いていただくようお願いします。 -
  • 「クリックしたCellの値を取得」はどこで行いたいのですか? ポストバックしてサーバー側でいいのですか? あと「うまくいきません」とが具体的に、どうなることを期待していて、結果はどうなるのですか? -
  • この質問とは関係ない話ですが、質問者さんが開いた以前のスレッドが放置状態です。
    http://qa.atmarkit.co.jp/q/3919
    -
  • アップされたコードをざっと見てみましたが、表題の「gridviewで表示した表のCellの値を取得する方法」が知りたいわけではなくて、GridView の行をクリックした時 "記事詳細投稿.aspx" という別ページに遷移すると共に、そのページにクリックした行のレコードの主キー値を渡したいということのように見えます。違いますか? -
  • 初心者の方は特に、局所的なことを聞くだけではなくて、全体的なシナリオを含めてやりたいことを書いてください。そうすれば「それはできないけど、やりたいことはこうすればできる」というような代案が出てくるかもしれません。また、質問が見当違いでそれにつられて回答も見当違いになってしまうという事も避けられ、お互い時間の無駄が省けます。 -
  • ご回答ありがとうございます。ASP.NETは4.5です。 llSは利用せずにvsのデバッグで開発しています。あと、DBはSQLSEVER2012を利用しています。プラウザはIEを利用しています。 -
  • ご指摘ありがとうございます。大変失礼しました。きちんと処理しました。 -
  • asp.netで作成しているアプリなのですが、2chみたいなものを作成したいです。ネタがあって対する書き込みができるように。それで、gridviewで作成した表(ネタ)をクリックすると、そのネタの値を取得して "記事詳細投稿.aspx" という別ページに遷移します。(ネタを書き込むための画面に飛ぶ。) -
  • gridviewで表示した表のCellの値を取得する方法を調べると、クリックしたCellをクリックしたコードの行のレコードの主キーに設定する方法を見つけました。やってみたのですが、うまくいかず、質問としてあげさせていただきました。
    -
  • できれば、今後のために、gridviewで表示した表のCellの値を取得する方法とページにクリックした行のレコードの主キー値を渡す方法を教えていただけないでしょうか。よろしくお願いします。
    -

回答

2chみたいなものを作成したいです。

そのページの html ソースを見れば分かると思いますが、クリックするのはハイパーリンク(a 要素)で、あらかじめ遷移先が href 属性に指定されているはずです。

質問者さんの場合、ASP.NET の GridView の各行に、同様なハイパーリンク(a 要素)を生成してやればいいわけです。

遷移先の "記事詳細投稿.aspx" にレコードの主キー値をどうやって渡すようにしているか分かりませんが、例えばクエリ文字列で渡す場合は a 要素の href 属性に以下のように設定してやればよさそうです(下記で xxx は主キー値)。

<a href="記事詳細投稿.aspx?id=xxx">そのページのタイトル・説明など</a>

行をクリックした時に主キー値を取得して渡すなどということはせず、ハイパーリンク(a 要素)を使って、あらかじめその行の id をクエリ文字列に含めた URL を href 属性に設定するのが ASP.NET ベースの Web アプリでも普通のやり方です。

その具体的なやり方は、以下のページが参考になると思います。

[ASP.NET]GridViewコントロールでハイパーリンクを表示するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/810aspgridvwlink/aspgridvwlink.html

編集 履歴 (1)
  • ありがとうございます。さっそくやってみます。 -
  • 不明な点があれば聞いてください。紹介したページではある列を削除してそれを HyperLinkField に置き換えてますが、たぶん、質問者さんの場合は追加してプロパティを設定するだけで済むと思います。 -
  • ありがとうございます。なんとかできました。また、よろしくお願いします。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。