VB.NETでマスター取込・編集画面を作っています。
GridViewには、sqlサーバーへDB接続してマスタテーブルのデータをあらかじめ表示させています。
『取込ボタン』を押下すると、tsvファイルの情報を取り込み、マスタテーブルの主キーに準じてGridViewの列の値を更新表示します。
マスターテーブルの主キーにないデータが取り込まれた場合は、新規で取り込まれたデータも追加表示します。
あわせて、GridViewのセルは、直接入力することにより編集可能にしています。
GridViewに更新フラグ列を1つ設けて、以下の値を代入します。
更新データなし …0
更新データあり …1
新規追加データあり …2
GridViewのセルの変更あり …3
■GridView画面イメージ■
|CODE|NAME|EVALUATION|DELFLG|UPDATE|
|:--|:--:|--:|--:|--:|--:|
|a0001|ACB|10.0|0||
|a0002|DEF|9.0|0||
|a0003|GHI|9.5|0||
| | | | | |
↓ 取込ボタンを押すと、
|CODE|NAME|EVALUATION|DELFLG|UPDATE|
|:--|:--:|--:|--:|--:|--:|
|a0001|ACB|9.5|0|1|
|a0002|DEF|9.0|0|0|
|a0003|GHI|9.5|1|1|
|a0004|JKL|8.0|0|2|
ここで、今困っているのは、新規追加データのGridViewのセルを変更したときは、
フラグを『2』の状態のままにしたいのです。
以下のコードを書いてみたのですが、これだとセルをクリックした瞬間にフラグが3になってしまうというありえない仕様となりました。
'取込ボタン Private Sub btnCap_Click(sender As Object, e As EventArgs) Handles btnCap.Click 'データグリッドビューの行数を取得 Dim RowsCount As Integer = Me.DataDridView1.RowCount Dim i As Integer = 0 '評価ファイルの読み込み Dim cReader As New System.IO.StreamReader("C:\04.MASTER\EVA\20170201.txt", _ System.Text.Encoding.Default) Dim FirstLine As Boolean = True 'DB接続 Dim objDBM As DBManager = DBManager.CreateInstance While (cReader.Peek() > -1) Dim stBuffer As String = cReader.ReadLine() If FirstLine Then FirstLine = False Continue While End If '読み込んだものをタブ区切り Dim TestArray() As String = Split(stBuffer, Chr(9), , CompareMethod.Text) '3列目のコードと6列目の評価値を取り出す Dim CCode As String = TestArray(2) Dim CEva As Decimal = TestArray(5) '■データ文字列チェック Dim ValEva As String 'Format()で数値型を文字列型へ変換 ValEva = Format(CEva, "0.0000") '行数を数えるためのsql文用変数 Dim CountsrSql As String = "select CODE,EVALUATION from T_EVALUATION where CODE='" & CCode & "'" 'UPDATE文用変数 Dim UpstrSql As String 'INSERT文用変数 Dim InstrSql As String 'UPDATE用sql文 UpstrSql = "update T_EVALUATION set EVALUATION = '" & v & "' where CODE = '" & CCode & "' " 'insert用sql文 InstrSql = "insert into T_EVALUATION (CODE,EVALUATION) values ('" & CCode & "','" & ValEva & "')" 'コード検索 Dim dr() As DataRow = dtTable.Select("CODE= '" & CCode & "'") 'コードがある場合 If dr.Length > 0 Then 'コードが一緒なら、更新しない・・・updateフラグ 0 If dr(0)("EVALUATION") = ValEva Then dr(0)("update") = "0" End If '評価値が変更されてたら、更新する・・・updateフラグ 1 objDBM.RunSQL(UpstrSql, Nothing) dr(0)("EVALUATION") = ValEva dr(0)("update") = "1" Else 'コードがなければ新規追加・・・updateフラグ 2 objDBM.RunSQL(InstrSql, Nothing) Dim adr As DataRow = dtTable.NewRow adr("CODE") = CCode adr("NAME") = "" adr("EVALUATION") = ValEva adr("DELFLG") = "0" adr("update") = "2" dtTable.Rows.Add(adr) End If End While Me.DataDridView1.DataSource = dtTable End Sub 'グリッドビューでセルの値が変更された場合、更新列に3を表示する Private Sub DataDridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataDridView1.CellClick If e.RowIndex >= 0 Then DataDridView1.Rows(e.RowIndex).Cells(4).Value = "3" End If End Sub
グリッドビューの処理に、
If e.RowIndex >= 0 And dgvRate.Rows(e.RowIndex).Cells(4).Value <> "2" Then
DataDridView1.Rows(e.RowIndex).Cells(4).Value = "3"
End If
とも書いてみたのですが、
「型 'System.InvalidCastException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました。追加情報:演算子 '<>' は 型 'DBNull' と 文字列 "2" に対して定義されていません。」
と、怒られます。
CellClickのイベントはたまたま調べていて見つけたので使ってみたのですが、そもそもこれが希望の処理に対して適切なのかわかりません。
上記の処理のあとに、保存ボタンを押下することで、変更内容や追加内容をDBのテーブルへ反映させる処理をしようと思っているので、保存ボタンを押した際にフラグ3が反映する方法もありそうなのですが、いかんせん書きぶりがひらめきません。
GridViewの処理記述に手を加えて、何とか希望通りに動くよう、何かヒントをご教示いただけませんでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー