- - PR -
SPREADの行削除について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2007-07-30 11:25
外しているかもしれませんが普通に考えてみます。 普通に考えると DeleteRow という Action を実行した時点で 1 行消えているわけで、MaxRows もデクリメントされることが望まれます。 おそらくその望まれることが行われているのではないかと思います。 よって、DeleteRow した場合に MaxRows をあなたがデクリメントする必要はないと思われます。 私の仮説が正しいのならば、最終行が消えるのは当たり前ということになります。 MaxRow をデクリメントしていますから。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 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にするとこの現象は起きず行番号の順番も正しいものになっています。 動作がヘルプに載っている動作と異なってしまっているんですよね。 データ上も問題なく動くのか、じゃんぬねっとさんの仮説を検証してみたいと思います。 | ||||
|
投稿日時: 2007-07-30 16:43
検証してみました。問題なく動きそうですが、別な方法でうまくいくものを見つけましたのでそちらを利用します。
ADOデータコントロールを使用せずにレコードセットにデータを格納し、そこからスプレッドに表示する方法に変更しました。 情報いただきましてありがとうございました。 | ||||
|
投稿日時: 2007-07-30 17:21
Adodc は ADO データ コントロールでしたか。 なるほど、それだと連結したデータ コントロール側が同期を取るので MaxRows は勝手にデクリメントされますね。 たぶん。 私も Recordset として切り離した方法が好きです。 データ更新の時にキャンセルの実装に困らなくて済むからという理由ですが。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1