- PR -

CheckBoxをレコードに常時書き込むには・・・

投稿者投稿内容
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-08-31 09:00
Visual Web Developer 2008 EEにて、VBでWeb開発はじめました初心者です。
データベースはAccessを利用してます。

作りたいものは商品の検索システムです。

AccessをGridViewで表示して検索できるところまではすぐ出来ました。

追加機能として、各商品にフラグをつくり管理したいと考えているんですが、フラグは常時変更できるものにしたいと考えています。

それで、Accessに「Yes/No型」の項目を作って、GridViewにはcheckboxテーブルで表示させるところまで作りました。

そのCheckBoxをクリックすると即Accessの該当レコードを書き換えるプログラムを書きたいと思っているのですが、上手く行きません。

自動PostBackして、表示を変えたりは出来ましたが、データベースが更新されません。

CheckBoxをクリックしたときのハンドラで記述するのかなと思ったのですが、アクセスのレコードを編集するのはどうすればいいのでしょう?


[ メッセージ編集済み 編集者: HM 編集日時 2008-08-31 21:53 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-31 15:52
引用:

HMさんの書き込み (2008-08-31 09:00) より:

データベースはAccessを利用してます。


Web アプリケーションで Access (というか MDB)... 大丈夫でしょうか。

引用:

自動PostBackして、表示を変えたりは出来ましたが、データベースが更新されません。
CheckBoxをクリックしたときのハンドラで記述するのかなと思ったのですが、アクセスのレコードを編集するのはどうすればいいのでしょう?


"思った" だけで試していないのでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-08-31 18:27
MDBってまずいんですかね?
もともとASP + MDBで作りはじめてたんだけど、「時代遅れだ、VWDにしなさい」って助言を受けてはじめました。

グリッドビューとデータベースの配置しただけでページングが出来るということに非常に感動しました。

Accessがそのまま読み込めて、もとのデータベースは隠蔽してくれるようだったんでそのまま作っています。
時間が取れたらSQLに移そうと思っていますが、Accessの入ってる出先のPCで見れる必要もあるんで、そのまま使ってます。

一応いろいろ試してみたり、一昨日からずっとgoogleで検索して探してるんですが、コレっていう記事に出会えず・・・

[ メッセージ編集済み 編集者: HM 編集日時 2008-08-31 21:15 ]
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-08-31 19:25
いちばん引っかかってるのはGridViewの中のCheckboxが、何行目のcheckboxなのかが分からないことです。

CheckBoxの値そのものは
DirectCast(sender, CheckBox).Checked

で取得できることがわかりました。

チェックされたレコードをあらわすユニークな値はどこで取得すればよいのでしょう?

コードとしては下のような感じで実装できると考えています。


Dim updatestr As String = _
"UPDATE table1 SET チェック = "
& DirectCast(sender, CheckBox).Checked _
& " WHERE ( ID = " _
& ( --- IDが取得できればいいんだけど --- ) & ");"

Me.AccessDataSource1.UpdateCommand = updatestr
Me.AccessDataSource1.Update()

結局、WHEREに指定する変数をどうやって求めるかで止まっています。

[ メッセージ編集済み 編集者: HM 編集日時 2008-08-31 21:41 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-08-31 22:39
AccessDataSource(またはそれ以外のDataSource)を使ってますよね?
データソースの構成ウィザードのSelectステートメントを生成する箇所で、
[詳細設定]からUpdate文を自動生成できますよね。
これによって、C#のコードを一切書く必要はないなずです。
(GridView側では「編集を有効にする」をonにします)

引用:
時間が取れたらSQLに移そうと思っていますが、Accessの入ってる出先のPCで見れる必要もあるんで、そのまま使ってます。

とりあえず、ということなら問題ないと思いますが
SQL Serverに移行したときに、若干変更を加える必要があるかもしれません。
HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-08-31 22:58
返信ありがとうございます。

すみません。その方法の場合、

編集→チェック→更新

と、3回クリックする必要がありますよね??

フラグを立てる作業を10000のアイテムに対して連続して3000回行う使い方を想定しているので、クリック数はチェックボックスをクリックする1回だけにとどめたいと考えています。

そのため、自動postbackとクリック時のハンドラを利用してVBのコードで記述する必要があると考えています。

[ メッセージ編集済み 編集者: HM 編集日時 2008-08-31 22:59 ]
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-09-01 00:20
引用:

フラグを立てる作業を10000のアイテムに対して連続して3000回行う使い方を想定しているので、クリック数はチェックボックスをクリックする1回だけにとどめたいと考えています。
[ メッセージ編集済み 編集者: HM 編集日時 2008-08-31 22:59 ]



想定しているケースが異常に思える。インターフェ−スなり 設計を見直したほうがいいような
ちなみにUPDATE分は複数行の更新ができるのは 理解してますよね


HM
会議室デビュー日: 2008/08/31
投稿数: 12
投稿日時: 2008-09-01 01:03
想定しているケースですが、
「検索して該当するレコードにチェックをすける」
作業を複数人でやり続けることを目的としてWebアプリを製作しています。

みなさんの助言を基にしながらコードを書いてみました。
グローバル変数を使ったりもしてるんですが・・・。
問題はすでにチェックが入っているチェックボックスをチェックしたときに正常にレコードは書き換えられるのに、ちゃんと表示されない点。
更にちゃんと表示されていないときに更にチェックをいじると次は完全にデータが破壊する点です。

コード:

Public old_CHK(30) As Boolean

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim count As Integer = 0
For Each row As GridViewRow In GridView1.Rows
old_CHK(count) = CType(row.FindControl("CheckBox1"), CheckBox).Checked
count += 1
Next
End Sub

Protected Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim count As Integer = 0
For Each row As GridViewRow In GridView1.Rows
If old_CHK(count) <> CType(row.FindControl("CheckBox2"), CheckBox).Checked Then
Dim updatestr As String = _
"UPDATE table1 SET チェック = " _
& DirectCast(sender, CheckBox).Checked _
& " WHERE ( ID = " _
& CType(row.FindControl("Label2"), Label).Text & ");"
Me.AccessDataSource1.UpdateCommand = updatestr
Me.AccessDataSource1.Update()
count += 1
End If
Next
End Sub



何かアドバイスいただけないでしょうか?


[ メッセージ編集済み 編集者: HM 編集日時 2008-09-01 01:07 ]

スキルアップ/キャリアアップ(JOB@IT)