- PR -

Gridviewの一括更新:インデックスが配列の境界外、でエラー

1
投稿者投稿内容
まなか
常連さん
会議室デビュー日: 2008/04/17
投稿数: 37
投稿日時: 2009-01-06 15:46
http://msdn.microsoft.com/ja-jp/library/aa992036(VS.80).aspx

これを参考に Gridviewの一括更新を作成しました。
CD、DTが主キーで、変更可能なのはtxtPriceです。

Protected Function IsRowModified(ByVal r As GridViewRow) As Boolean

Dim currentITEM As String = GridView1.DataKeys(r.RowIndex).Values("CD").ToString
Dim currentDT As String = Format(GridView1.DataKeys(r.RowIndex).Values("DT"), "yyyy/MM/dd").ToString
Dim currentPrice As String = CType(r.FindControl("txtPrice"), TextBox).Text

Dim dRow As System.Data.DataRow = _
dDtTable.Select(String.Format("CD= '" & currentITEM & "'", "DT= '" & currentDT & "'"))(r.RowIndex)

↑ここで「インデックスが配列の境界外です。」で落ちてしまいます。

If Not currentUp.Equals(dRow("UP").ToString()) Then
Return True
End If

Return False

End Function

マイクロソフトのサンプルでは、
Dim row As System.Data.DataRow = _
originalDataTable.Select(String.Format("EmployeeID = {0}", currentID))(0)
となっていたので、同じように
Dim dRow As System.Data.DataRow = _
dDtTable.Select(String.Format("CD= '" & currentITEM & "'", "DT= '" & currentDT & "'"))(0)
としたところ、GridViewの1行目の値しか見に行っていませんでした。
そこで、r.RowIndexで行数を指定するようにしたのですが…

基本的なところが全くわかっていませんが、よろしくお願いします。
まなか
常連さん
会議室デビュー日: 2008/04/17
投稿数: 37
投稿日時: 2009-01-06 16:11
自己レスです。
以前はうまくいなかったのですが、↓に変更したらうまくいくようになりました。
検索条件を 「,」⇒「AND」にも変更しました。

Dim dRow As System.Data.DataRow = _
dDtTable.Select(String.Format("CD= '" & currentITEM & "' AND DT= '" & currentDT & "'"))(0)

If Not currentUp.Equals(dRow("UP").ToString()) Then
Return True
End If


[ メッセージ編集済み 編集者: まなか 編集日時 2009-01-06 16:22 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-06 16:25
エラーが発生する場所がわかっているのであればデバッグポイントを設置して解決出来ると思います。

コード:
dDtTable.Select(String.Format("CD= '" & currentITEM & "'", "DT= '" & currentDT & "'"))(r.RowIndex) 


下記のいずれかが想定されている物と違うのではないでしょうか。
  • dDtTable の中身
  • Select メソッドの結果の配列数
  • currentITEM、currentDT、r.RowIndex の値
あと、この行の String.Format って意味ありますか?

【追記】
String.Format("EmployeeID = {0}", currentID)
を書き換えて
String.Format("CD= '" & currentITEM & "'", "DT= '" & currentDT & "'")
って言うのがそもそもおかしくないでしょうか。
サンプルのこの箇所は何をしているかわかりますか?

[ メッセージ編集済み 編集者: King 編集日時 2009-01-06 16:38 ]
まなか
常連さん
会議室デビュー日: 2008/04/17
投稿数: 37
投稿日時: 2009-01-07 09:22
Kingさん、ありがとうございます。

String.Format("EmployeeID = {0}", currentID)

はEmployeeIDを数値型で指定しているので、Stringに変えている、でいいでしょうか?

とすると、私のコードのString.Format は必要ないですね…
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-07 10:07
引用:
String.Format("EmployeeID = {0}", currentID)
はEmployeeIDを数値型で指定しているので、Stringに変えている、でいいでしょうか?

違います。
{0}はプレースホルダです。
下記を参照して下さい。
http://msdn.microsoft.com/ja-jp/library/fht0f5be(VS.80).aspx

他のコードについても意味がわからず書いている箇所があるのでしょうか。
時間が無いのかもしれませんが、
サンプルを使用する際は何をしているかをきっちり理解したほうが良いと思います。
google で検索したら何でもすぐ出てきますしね。

【追記】
デバッグでエラーが出る行のそれぞれの値や内容の確認はやりましたか?

[ メッセージ編集済み 編集者: King 編集日時 2009-01-07 10:35 ]
まなか
常連さん
会議室デビュー日: 2008/04/17
投稿数: 37
投稿日時: 2009-01-07 13:16
引用:

Kingさんの書き込み (2009-01-07 10:07) より:
他のコードについても意味がわからず書いている箇所があるのでしょうか。
時間が無いのかもしれませんが、
サンプルを使用する際は何をしているかをきっちり理解したほうが良いと思います。
google で検索したら何でもすぐ出てきますしね。

【追記】
デバッグでエラーが出る行のそれぞれの値や内容の確認はやりましたか?



はい…意味がわからず、エラーが起きたときに対応できない状況です。
Googleで調べてもいますがなかなか、といったところです。
デバッグでの確認は行いました。
ありがとうございます。
1

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