2012/05/31

.NET データグリッドで行が追加できないと思ったら。。

以下のようにデータグリッドに行を追加するコードを書いてもどうしても Rows.Add() のところで落ちてしまうという現象に遭遇。

Dim iId as Integer = DataGridView1.Rows.Add()
DataGridView1.Rows(iId).Cells("ColumnA").Value = "AAAA"
.....

いろいろプロパティを変えてみたが解決されず、AllowUserToAddRows = false になっていたので、これをtrueにしたら、上記のコードをすべてコメントアウトしてもデータグリッドビューを描画しようとする時点でエラーで落ちてしまう。

原因を探っていたら、CurrentCellChangedイベントの処理が記述されているのでデータグリッドに列を追加するときにこのイベントが発生していることがわかった。

その中で DataGridView1.CurrentRow().Index を取ろうとしていたところで落ちていたことが判明。

If DataGridViewTani.CurrentRow() Is Nothing Then Return End If dim iCurrentRowIdx as Integer = DataGridViewTani.CurrentRow().Index 'ここで落ちてた dim strTmp as String = DataGridViewTani.Rows(iCurrentRowIdx).Cells("ColumnA").Value


CurrentCellChangedイベント処理内を以下のように修正したら正常に行が追加されるようになった。

If DataGridViewTani.CurrentRow() Is Nothing Then Return End If dim iCurrentRowIdx as Integer = DataGridViewTani.CurrentRow().Index 'これを追加 If iCurrentRowIdx > 0 Then dim strTmp as String = _ DataGridViewTani.Rows(iCurrentRowIdx).Cells("ColumnA").Value End If

イベント処理は全部チェックしましょう。。

VB.NET 日付の比較をする

日付の比較。date.compare を利用する。が、いつも戻り値が分からなくなるのでメモ。

dim iRet as Integer = Date.Compare(date1,date2)

結果
iRet = -1 : date1 < date2
iRet = 0 : date1 = date2
iRet = 1 : date1 > date2


同一テーブル内の違うフィールドにデータをコピーする

あるテーブルに新しくフィールドを追加した場合などで、すでにある同じ行のあるフィールドのデータをそのままコピーしたい場合のSQL。

たとえば、TABLE_A に次のようにデータが入っているとする。

| Field1 | Field2 | Field3 | | 001 | abcd | 22 | | 001 | dnkda | 34 | | 001 | tsgt | 9 | | 001 | lanhp | 13 |

このテーブルに 'Field4' というフィールドを追加してそのフィールドに次のように 'Field3' の値をコピーしたいときの処理にすこし手間取ったのでメモしておく。

| Field1 | Field2 | Field3 | Field4 | | 001 | abcd | 22 | 22 | | 001 | dnkda | 34 | 34 | | 001 | tsgt | 9 | 9 | | 001 | lanhp | 13 | 13 |

まず、'Field4' の初期値を決めて、すべての列に初期値を入れておく。今回の場合 '0' をセット。

| Field1 | Field2 | Field3 | Field4 | | 001 | abcd | 22 | 0 | | 001 | dnkda | 34 | 0 | | 001 | tsgt | 9 | 0 | | 001 | lanhp | 13 | 0 |

この状態の TABLE_A にたいして以下のSQL文を実行することで解決。

update TABLE_A set Field4 = Field3 where Field4 = 0



単純なのに、案外てこずってしまった。。