質問者
動的にSQLを設定しているGridViewにcheckBoxを付け、複数選択させたい

質問
-
すべての返信
-
ご返事ありがとうございます。
ユーザがGridViewに表示されたレコードを複数選択することを想定しています。
このためにGridViewの機能ではなく、CheckBoxを付けて、・・・という事を実装したいと考えました。
実はこの処理は、まずユーザがデータを検索する照会画面があって、そこでは、条件句(WHER句)をさまざまに
指定できます。ですのでSQLが動的になってしまいます。その画面で作成したSQL文を当該の画面で受けて、
GridViewで表示します。そして表示したレコードのうち、選択したレコード(複数可)、即ちチェックされたレコードを
UPDATEしたいのです。
-
一度に複数の行をEditModeにしてしまうという手もあると思います。
Show all GridView Rows in EditMode
http://aspadvice.com/blogs/azamsharp/archive/2006/11/08/Show-all-GridView-Rows-in-EditMode.aspxデータベースへの更新は以下が参考になると思います。DataGridの例で古いのですが、基本的にはGridViewでも考え方は同じです。
Editing Multiple Rows At Once
http://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchTopQuestionsAboutASPNETDataGridServerControl.asp?frame=true#vbtchtopquestionsaboutaspnetdatagridservercontroleditingmultiplerows -
「どっとねっとふぁん」さん他、みなさんレスありがとうございます。
SQLの部分は今までのレスを参考に自分で何とかしようと思います。
ただ、もう1点、私が知りたい事があります。
データはGridViewには、SQLで取得したレコードが返ってきますが、その他に、CheckBoxを追加して、
その値を基にどのレコードが選択されたのかを知りたい、ということがります。
まず、データは今ODP.NETを使っていますが、データを表示するまではこうしています。
protected void Page_Load(object sender, System.EventArgs e)
{
// 入力された店舗コードを検索する。予約テーブル
string cnStr = "User Id=xxx; Password=yyy; Data Source=ds";
OracleConnection cnBk = new OracleConnection(cnStr);
cnBk.Open();
OracleCommand cmd = cnBk.CreateCommand();// レコード検索:SQL文設定
string cmdStr = "SELECT A,B,C FROM TBL_A;
cmd.CommandText = cmdStr;
OracleDataReader rdr = cmd.ExecuteReader();// dbgBkSgCdはGridView。
dbgBkSgCd.DataSource = rdr;
dbgBkSgCd.DataBind();// 後始末
cmd.Dispose();
rdr.Close();
rdr.Dispose();
cnBk.Close();
cnBk.Dispose();
}この後、SELECTリストとは別にCHECKを入れる列をGridViewに加え、そしてその列を参照して
チェックが入ったレコードを取得する、という処理を実装しいのですが、この辺をプログラムで
どう書けばよいのか教えていただけないでしょうか。
-
そう考えまして、
HTMLソースの<columns>に
<asp:TemplateField SortExpression="chkCancelSort" HeaderText="キャンセル">
<ItemTemplate>
<asp:CheckBox runat="server" ID="chkCancel" />
</ItemTemplate>
</asp:TemplateField>
を加え、ボタンのクリック時にfor (int i = 0; i < grid.Rows.Count; i++)
{
txtTest2.Text = txtTest2.Text + grid.Rows.Cells[0].Text + Environment.NewLine;
}
としましたが(Cells[0]がチェックボックスの列)、値が取れないのですが、どこがおかしいのでしょう?他の列の値は取れるのですが・・・。
-
> CheckBoxであれば、Checkedプロパティというところへ発想が行くようにならないといけないんですが
ああ、そこも気にはなりました。
> コントロールへの参照はわかりにくいとしてもコントロールツリーという意識がないとわかりにくいかもしれませんね。
この点は書籍だと
Microsoft Visual Studio 2005によるWebアプリケーション構築技法
に記述があったはず。
ページのトレース情報を表示するとどんなコントロールが生成されているかわかるようになってるんですけどね。ちなみに Cell[0].Controls[0] をCheckBoxにキャストしてもデータは取り出せると思います。
FindControlを使うよりは直接的なので若干早いかな、と思いますが、プログラムの意味は伝わりにくくなるなぁ。 -
皆様、回答ありがとうございました。
何とか実装できそうなので、後はがんばってみます。
ちなみに、Template関連など、手がかりになりそうなトピックを書いているサイトを探している中で、
CheckBoxへのキャストしているサイトもWEBで探している中にありましたが、
CheckBox ckb = (CheckBox)wkRow.FindControl("chkCancel");
と書いたりしみたのですが、うまくいかず・・・「()」が足りないことに気が付かなかったりしていたようです。
(ちなみに、上記のコードはなぜか今はビルドが通ります。・・・なぜだろう。悩んでいた時は通らなかったのに。)