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

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

新規登録して質問してみよう
ただいま回答率
85.49%
SQL Server

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

VB.NET

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

Q&A

解決済

1回答

10191閲覧

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

nua

総合スコア18

SQL Server

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

VB.NET

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

0グッド

0クリップ

投稿2017/02/09 06:01

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/09 07:01

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

2017/02/09 07:14

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

回答1

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 07:01

編集2017/02/09 07:09
Rayla_Purateado

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nua

2017/02/09 07:11

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

2017/02/09 07:15

ただ、安直にDataTableを使うと、 DataTable自体がすごく重いものなので、 何万行とかの取得には向いていません。 ですので、その場合は別のやり方をします。 (なおVB.NETは離れて3年なので忘れている模様)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問