- PR -

SPREADの行削除について

1
投稿者投稿内容
Masa
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 65
投稿日時: 2007-07-30 09:29
こんにちは。

現在フォームに貼り付けてあるスプレッドシートの選択行を削除しようとすると、選択した行と、最終行が削除されてしまうという現象が起きています。
以下に環境と簡単なコードを記載します。

環境
OS:Win XP Pro SP2
VB:VB6 SP6
SPREAD3.0J Version 3.0.0.52

ソース
'フォームロード
Private Sub Form_Load()
Dim rtn As Boolean
Dim wsql As String

P_total_dsn = "PROVIDER=MSDASQL;dsn=XXX;uid=XXX;pwd=XXX"
rtn = DB_Connect(1, P_total_cnn)

wsql = "select * from abcd_test"

With Adodc1
.CommandType = adCmdText
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.ConnectionString = P_total_dsn
.RecordSource = wsql
End With

Adodc1.Refresh


With fpSpread1
.MaxRows = Adodc1.Recordset.RecordCount
.MaxCols = Adodc1.Recordset.Fields.Count
End With

fpSpread1.DataSource = Adodc1

End Sub

'削除ボタンクリック
Private Sub Command1_Click()
With fpSpread1
.Row = .ActiveRow
.Row2 = .ActiveRow
.BlockMode = True
.Action = ActionDeleteRow
.BlockMode = False
.MaxRows = .MaxRows - 1
End With
End Sub

スプレッドのデータソースはADODC(ADOデータコントロール)を使用しています。
なお、スプレッドのDAutoSaveプロパティをFalseに設定して削除を実行すると、
.Action = ActionDeleteRowで一行消え、.MaxRows = .MaxRows - 1でまた一行消えます。

Trueの場合は正しい動き(ActionDeleteRowで対象データが消え(この時点ではMAXROWSの値は変わらない)その後MAXROWSを-1するところで行が減ります)

ネット等で調べてみましたが特に情報がなかったため投稿しました。
この現象について何でもいいので情報いただければと思いますのでよろしくお願いいたします。



[ メッセージ編集済み 編集者: Masa 編集日時 2007-07-30 09:38 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-30 11:25
引用:

Masaさんの書き込み (2007-07-30 09:29) より:

.Action = ActionDeleteRowで一行消え、.MaxRows = .MaxRows - 1でまた一行消えます。

Trueの場合は正しい動き(ActionDeleteRowで対象データが消え(この時点ではMAXROWSの値は変わらない)その後MAXROWSを-1するところで行が減ります)

ネット等で調べてみましたが特に情報がなかったため投稿しました。
この現象について何でもいいので情報いただければと思いますのでよろしくお願いいたします。


外しているかもしれませんが普通に考えてみます。 普通に考えると DeleteRow という Action を実行した時点で 1 行消えているわけで、MaxRows もデクリメントされることが望まれます。 おそらくその望まれることが行われているのではないかと思います。 よって、DeleteRow した場合に MaxRows をあなたがデクリメントする必要はないと思われます。

私の仮説が正しいのならば、最終行が消えるのは当たり前ということになります。 MaxRow をデクリメントしていますから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Masa
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 65
投稿日時: 2007-07-30 11:51
じゃんぬねっとさん

書き込みありがとうございます。

>DeleteRow した場合に MaxRows をあなたがデクリメントする必要はない
上記のようなご指摘をいただきましたが、SPREADのヘルプを参照すると以下のような記載があります。

*************ここからヘルプを引用*************
Row プロパティが示す行を削除します。複数の行を削除する場合、Row、Row2 の各プロパティで削除する範囲を指定し、BlockModeプロパティをTrueにしてセルブロックを有効にしてください。

With fpSpread1

.Row = 3
.Row2 = 4
.BlockMode = True
.Action = SS_ACTION_DELETE_ROW
.BlockMode = False
End With

行を削除してもMaxRows プロパティの値は変わりません。

*************ここまでヘルプを引用*************

ヘルプではMaxRowsをデクリメントする必要があるようなことが書いてあるんです。
それで、現在の動きですがスプレッドシートの左側に行番号を表示しているのですがその順番もおかしくなり(1,2,3,5,6,7)のように削除した行が飛ばされます。

スプレッドのDAutoSaveプロパティをTrueにするとこの現象は起きず行番号の順番も正しいものになっています。

動作がヘルプに載っている動作と異なってしまっているんですよね。

データ上も問題なく動くのか、じゃんぬねっとさんの仮説を検証してみたいと思います。
Masa
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 65
投稿日時: 2007-07-30 16:43
検証してみました。問題なく動きそうですが、別な方法でうまくいくものを見つけましたのでそちらを利用します。

ADOデータコントロールを使用せずにレコードセットにデータを格納し、そこからスプレッドに表示する方法に変更しました。

情報いただきましてありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-30 17:21
引用:

Masaさんの書き込み (2007-07-30 16:43) より:

ADOデータコントロールを使用せずにレコードセットにデータを格納し、そこからスプレッドに表示する方法に変更しました。


Adodc は ADO データ コントロールでしたか。 なるほど、それだと連結したデータ コントロール側が同期を取るので MaxRows は勝手にデクリメントされますね。 たぶん。

私も Recordset として切り離した方法が好きです。 データ更新の時にキャンセルの実装に困らなくて済むからという理由ですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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