- PR -

GridViewからのDataSet取得

投稿者投稿内容
32WH
会議室デビュー日: 2006/08/03
投稿数: 15
投稿日時: 2006-08-11 11:22
どっとねっとふぁん様
度々の回答ありがとうございます。

引用:

んー。
どのような実装をされているのかが詳しくはわからないので、何が起きてるのか
推測もできませんね。
重要な部分のソースコードを出してもらうのがいいかなぁ。。。



丸ごとすべてではないですが、
今回の対象になるであろう部分のソースはこんな感じで実装しています。
(sakujo_Clickに関しては[GridViewからデータセットを抜き出す]処理以降は未実装ですが…)
(あまり人に見せられないソースなのはご容赦ください。)

実装部:
コード:

' GridView1にはBindFiledとテンプレート列としてDropDownList,TextBox,CheckBoxを
' DataBindingsでSelectedValue,Text,CheckedにBind(項目名)として定義してあります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

' データバインド部
Dim DataSetObj As New DataSet

If Not IsPostBack Then
' (ここにデータの取得処理が入っていると思ってください。)
' 条件を元にDataAdpterからFillを実行してDataSetに与えています。
GridView1.DataSource = DataSetObj
DataBind()
End If

End Sub

Protected Sub sakujo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles sakujo.Click

Dim RowIdxInt As Integer = 0 ' 現在選択されている行の位置
Dim DataSetObj As New DataSet ' GridView格納用DataSet
Dim LoopCountInt As Integer = 0 ' ループカウンタ

' 行位置取得
RowIdxInt = CType(GridView1.SelectedIndex, Integer) ' これは取得できるのでGridViewがすべてNothingでは無さそう

' 選択されていなければ処理を抜ける
If(RowIdxInt = -1) Then
Exit Sub
End If

' GridViewからデータセットを抜き出す

'#間違い
'DataSetObj = CType(GridView1.DataSource, Integer) ' ←これでNothingが返る
DataSetObj = CType(GridView1.DataSource, DataSet) ' ←これでNothingが返る

' 取得したDataSetを頭〜尻尾までLoop
For LoopCountInt = 0 To (DataSetObj.Table(0).Rows.Count - 1) Then
If(LoopCountInt = RowIdxInt) Then
' 行の削除処理

End If
Next LoopCountInt

' 指定行を削除したDataSetをGridViewのデータソースに指定
GridView1.DataSource = DataSetObj
DataBind()
End Sub



引用:

ちなみに、表示はともかく、その後の画面上での修正作業はある程度動いてるんでしょうか。



修正作業は行えますが、
登録の部分のロジックはまだ作成していないので何とも…です。

もし、ここから何かわかるようでしたら、
ご教授いただければ幸いです。

肝心のコードを間違えていました…

[ メッセージ編集済み 編集者: 32WH 編集日時 2006-08-11 11:24 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-08-11 12:39
そういえばこのあいだちょうど参考になりそうなページ見つけていたのでした。
http://www.dotnetbips.com/articles/displayarticle.aspx?id=511

これがそのまま使えるわけではありません。
このページだと毎回データをデータベースから取り出してますけど、これを一度だけ
とりだして、あとはDataSetをセッションオブジェクトにでも格納しておくようにします。
そして常にセッションに格納されたデータを利用する必要があります。
また、データの変更も直接データベースに書き込みにいってますけど、そのかわりに
上記で作ったDataSetの内容を書き換えるように修正しないといけません。
データの削除の記述はないですが、データの変更を参考にすれば同じような考え方で
いけるかな。
削除するデータのキー項目の値はとりだせたはずですし。

そうやって自分が持っているDataSetを更新しておいて、登録ボタンが押されたときに
そのDataSetをデータベースに書き戻してあげるようにすればいけるんじゃないかな。

ただ、この間にデータの一部を他の人が書き換えていたときにどう処理するかの
問題がありそうですけどね。

#いま修正ができている(ように見える)のはGridViewがViewStateに持っているデータを操作しているだけのように思えます。
 内部的にDataSet等を持っているのではないのかも。。。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-11 15:24
引用:
画面上で編集したデータは画面上にある[登録]ボタンを押下しない限り
反映しないようなイメージです。
なので、SqlDataSourceを使う事が出来ません…。

ああ、わかりました。一行ずつ(見た目だけ)編集していって、DBには[登録]ボタンを押したときにまとめてドーン、
ということですね。そして[登録]ボタンは一つだけ、GridViewの外にある、と。

私もにたようなのを作ったんですが、違うのは、Templateを使って最初から全行編集可能状態にしています。
各行に[編集]ボタンがありません。[登録]ボタンが押されたときには全行をUpdateRowしています。
dotnetmemo
常連さん
会議室デビュー日: 2006/04/29
投稿数: 24
投稿日時: 2006-08-11 16:09
参考までに

以下のサイトにあるDataSet DataSourceを利用して双方向バインドしてあげればたぶん目的のことが達成できると思います。

ASP.NET 2.0 DataSet DataSource
http://weblogs.asp.net/aaguiar/articles/432695.aspx

あと注意点として、GridViewの更新ボタンによる更新を利用しないのであれば、DataSetに入力値を反映するためには全ての行にプログラムからUpdateRowを実行する必要があるかな。

(ASP.NET2.0の双方向バインドを上手く使うとコントロールとデータのデータの受け渡すためのコードが記述する必要がなくなります)

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