質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • VB.NET

    1048questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • SQL Server

    709questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

GridViewのセルの値が変更された場合に、列に特定のフラグを立てたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,857

nua

score 11

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の処理記述に手を加えて、何とか希望通りに動くよう、何かヒントをご教示いただけませんでしょうか。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/02/09 16:01

    GridView ということは ASP.NET の話ですか? Framework のバージョンは? コードは ``` と ``` で囲っていただけませんか。インデントされて見やすくなりますので。

    キャンセル

  • nua

    2017/02/09 16:14

    次回、また質問させていただく際に参考にさせていただきます。テラテイルの質問の仕方も勉強してみます・・・。

    キャンセル

回答 1

checkベストアンサー

0

ソースコード的になんとなくVB.NETかな?と思ったので、
VB.NETだろうという形で、答えさせていただきます。
(ASP.NETとかもあるだろ!とか言わないで...)

原因ですが、間違いなく

グリッドビューでセルの値が変更された場合、更新列に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

 

これが原因です。


あくまでも、考え方というか、私だったらこうやるかなというやり方ですと、
SQLサーバー(データベース)から取得時にDataTableを使い、
それを、GridViewへ突っ込みます。

そして、GridView上で変更された値と、DataTable上の値を比較し、
変更されていた場合、その列の対象の行のみ更新(UPDATE)するという処理にします。
(VB.NETだったらの話です)
(ASP.NETではそもそもDataTableが使えなかった覚えがあるので...うろ覚え)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/09 16:11

    回答ありがとうございます!
    DataTableと比較して変更されてたら行のUPDATE…なるほどですね。
    経験が浅すぎてひらめき幅がなく、本当に助かりました!
    またよろしくお願いします!

    キャンセル

  • 2017/02/09 16:15

    ただ、安直にDataTableを使うと、
    DataTable自体がすごく重いものなので、
    何万行とかの取得には向いていません。

    ですので、その場合は別のやり方をします。
    (なおVB.NETは離れて3年なので忘れている模様)

    キャンセル

同じタグがついた質問を見る

  • VB.NET

    1048questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • SQL Server

    709questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。