ネットが遅くてイライラしてない!?

VB6.0でデータベースの内容を更新するプログラムを作成しています。
1.データベースの内容をデータグリッドに読み込む
2.グリッドより1行を選択、レコードを新しくOpenしたダイアログに表示する。
3.ダイアログ内でレコードを修正・更新する。更新した内容をデータグリッドに反映させるため、グリッドのRefreshを行う。
4.ダイアログを閉じる。
とした場合、3のリフレッシュでブックマークの位置が変わってしまいます。

ブックマークを元通りに戻すため、2でブックマークの位置をバリアント型変数に退避し、4以降でブックマークを退避しておいた値に戻すようにしましたが、こうすると設定しなおしたブックマークの行がグリッドの先頭に表示されてしまい、ダイアログを開く前のグリッドとは違った表示になってしまいます。

FirstRowプロパティを使えば良いような気がしますが、FirstRowを単にストリング型変数を使って退避し、元に戻すわけではないようです。
(元に戻すときにエラーになります。)

FirstRowプロパティをうまく使われている方、ぜひご教示ください。
お願いいたします。


Public Sub Click_Mainte修正ボタン(Frm As Form, Dgd As DataGrid, AdoD As Adodc, NewFrm As Form)
Dim lngRow As Long
Dim strFirstRow As String
Dim varRow As Variant

On Error Resume Next
If Not Chk_Records(Dgd, Frm) Then GoTo Exit_
strFirstRow = Dgd.FirstRow
varRow = Dgd.Bookmark
Load NewFrm
NewFrm.Show vbModal
AdoD.Refresh
Dgd.Bookmark = varRow
Dgd.FirstRow = strFirstRow  '「ブックマークの値が不正です」エラーになってしまう。
Exit_:
On Error GoTo 0
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Refresh後に Bookmark > FirstRowの順に処理するのではなく、FirstRow > BookMarkの順に処理すればいいようですよ



FirstRowの復元は FirstRowに代入するのではなく、Bookmarkに代入してやるようにしてみましょう
保存しておく FirstRowはVariant型のほうがよさそうです

AdoD.Refresh
Dgd.Bookmark = varFirstRow
Dgs.Bookmark = varRow
    • good
    • 0
この回答へのお礼

せっかく回答くださったのに、気づくのが大変遅れ、申し訳ございませんでした。
質問してから1ヶ月近く経ったというのに、データグリッドの部分は半分あきらめてそのままにしておりました。

早速試してみたところ、思い通りの動作になりました!
ほんとうにありがどうございました。

お礼日時:2006/12/21 14:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridの列の数、行の数

いつもお世話になっております
VB6.0でDataGridをつかって
Accessのようにデータを表示しているのですが
表示しているデータの最大列数と最大行数を
求めたいのですが、やり方がわかりません
どうしたら最大列数と最大行数を求められるか
教えて下さい!お願いします

Aベストアンサー

こんばんは
最大列数は、DataGrid.Columns.Countで
最大行数は、表示してるレコードセットのRecordCountプロパティから得る。

でいかがでしょうか?

QVBのデータグリッドが表示されない!!!

こんにちはtmgmです。
データグリッドが表示されません。

状況としては
1.プログラムは正常に動いています。(「接続に成功しました」メッセージ、「レコード取得に成功しました」メッセージ、ともに表示されます。)

2.しかしデータグリッドには何一つ表示されません。(ツールボックスから貼り付けたままの状態です)

3.参照設定はMicrosoft ActiveX Data Objects 2.5 Library、コンポーネントはMicrosoft DataGrid Control6.0(SP5)(OLEDB)です。

どなたかお分かりになる方いらっしゃいますでしょうか?非常に困っています。
ご返答よろしくお願いします。

------------------------------------------------
Dim CONN As ADODB.Connection

'レコードセットの宣言
Dim RECO As ADODB.Recordset
'接続の宣言
Set CONN = New ADODB.Connection

'接続のプロパティ
With CONN
.ConnectionString=
    "provider=Microsoft.jet.oledb.4.0;" _
& "data source=C:\TESTMDB.mdb"
.Open
End With

MsgBox "データベース接続に成功しました"


  'レコードセットのプロパティ
Set RECO = New Recordset
With RECO
.ActiveConnection = CONN
.Source = "SELECT ~(省略)"
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Properties("IRowsetIdentity") = True
.Open
End With


  'レコードセットをデータグリッドに連結
Set D_GRID.DataSource = RECO

MsgBox "レコードセット取得に成功しました
------------------------------------------------

こんにちはtmgmです。
データグリッドが表示されません。

状況としては
1.プログラムは正常に動いています。(「接続に成功しました」メッセージ、「レコード取得に成功しました」メッセージ、ともに表示されます。)

2.しかしデータグリッドには何一つ表示されません。(ツールボックスから貼り付けたままの状態です)

3.参照設定はMicrosoft ActiveX Data Objects 2.5 Library、コンポーネントはMicrosoft DataGrid Control6.0(SP5)(OLEDB)です。

どなたかお分かりになる方いらっしゃいます...続きを読む

Aベストアンサー

#3の続き
SQL文のField名とグリッドのField名は一致していますか?括弧などあるとうまくいかない場合があります。
その場合は、SQL分でAS<別名>をつけグリットでも別名をfield名にするとうまきいきます。

これでだめならadodc経由でつないでみてはいかがでしょうか?

QDataGridコントロールのデータのコピー

いつもお世話になっております。

VisudalBasic6の開発環境で
Microsoft DataGrid Control(SP6)のDataGridコントロールを使用して、
Oracleデータベースから得られたテーブルのデータを表示させているのですが、
DataGridコントロールに表示されたすべてのデータをコピーし、エクセルなどにペーストすることはできないでしょうか?

方法をご存知の方おられましたらご教授願えないでしょうか?

Aベストアンサー

DataGrid1の親オブジェクトをくっつけたので
実際に合わせて変更してください。親をForm1としています。
縦スクロールバーを動かしてデータを見えるようにしました。


Private Sub Command1_Click()
Dim h As Long
Dim i As Long
Dim j As Long
Dim exlApp As Workbook
Dim strFile As String
Dim lnRow As Long
Dim lnCol As Long

'パス
strFile = "C:\test\5\myAAA.xls"
Set exlApp = GetObject(strFile, "Excel.Sheet")

'ヘッダのコピペ
For h = 0 To Form1.DataGrid1.Columns.Count - 1
exlApp.Worksheets("sheet1").Cells(1, h + 1) = Form1.DataGrid1.Columns(h).Caption
Next h

'データのコピペ
j = 1
Do While Form1.DataGrid1.Row <= Form1.DataGrid1.VisibleRows - 1
For i = 0 To Form1.DataGrid1.Columns.Count - 1
Form1.DataGrid1.Col = i
exlApp.Worksheets("sheet1").Cells(j + 1, i + 1).Value = Form1.DataGrid1.Text
Next
j = j + 1
If Form1.DataGrid1.Row < Form1.DataGrid1.VisibleRows - 1 Then
Form1.DataGrid1.Row = Form1.DataGrid1.Row + 1
Else
Exit Do
End If
Loop

exlApp.Windows(1).Visible = True
exlApp.Save
exlApp.Application.Quit
Set exlApp = Nothing
End Sub

DataGrid1の親オブジェクトをくっつけたので
実際に合わせて変更してください。親をForm1としています。
縦スクロールバーを動かしてデータを見えるようにしました。


Private Sub Command1_Click()
Dim h As Long
Dim i As Long
Dim j As Long
Dim exlApp As Workbook
Dim strFile As String
Dim lnRow As Long
Dim lnCol As Long

'パス
strFile = "C:\test\5\myAAA.xls"
Set exlApp = GetObject(strFile, "Excel.Sheet")

'ヘッダのコピペ
For h = 0 To Form1.DataGrid1.Columns.Count - 1
exlApp.Worksheets(...続きを読む

Qデータグリッドのセルの値を取得するには

データグリッドにある数行、数列のデータをレポートデザイナを使用せずに印刷したいのですが、グリッドのセルの値を取得するにはどうすればよいのかわかりません。よろしくお願いします

Aベストアンサー

こんばんは。

DataGridの現在のセルを取得、設定する
http://dobon.net/vb/dotnet/datagrid/currentcell.html
参考にどうぞ。

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

Qモーダルフォームとモードレスフォーム

この二つの違いはどういう違いがあるのでしょうか?
どなたか教えてください。お願いいたします。

Aベストアンサー

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォーム2が表示されたあと
にメッセージボックスが表示されます。
つまりCommand1はShowのあとのロジックを、フォーム2が閉じるまで、未処理のままとなるわけです。

画面上はフォーム2が前面、フォーム1が背面になるどちらも似たような表示に見えますが、
Command1の場合はフォーム1はフォームをクリックしても、フォーカスを持たない
Command2の場合はフォーム1はフォームをクリックすると、フォーカスを持ちえる
という点も違います。


簡単にまとめると、
vbModalの場合はフォーム2だけに作業処理を固定させたい時に使用します。vbModelessの場合はフォーム2はポップアップ的な使用方法の時に使います。

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォー...続きを読む

QVB6 DBと連結しないDataGrid

VB6の標準機能で、(行数可変の)一覧表示をするために、DataGridを使おうと思ったのですが、
どのサンプルを見ても、DBから取得したRecordSetをBindする方法しか載っていません。
そもそもVB6のDataGridとは、プログラム中でDB以外の情報を、挿入したり削除することって、出来ないのでしょうか?
(行オブジェクトをAddするようなイメージです)

よろしくお願いします。

Aベストアンサー

はい、出来ません。

DBと関係無いデータを表示するときは、フレキシブルグリッドを使ってます。

QMSFlexGrid 行選択状態

現在VBを勉強しております。(WindowsXP、VB6.0)

http://oshiete1.goo.ne.jp/qa996239.html
↑の質問と同じ内容で悩んでいるんですが、回答を見ても理解出来ず、解決出来ていません(>_<)

1.処理起動時に、テキストファイルからデータを読み込み、グリッドへ表示した後。
2.ソートした後。
3.「検索」処理にてデータを絞り込んで表示した後。

以上3点の時に、行選択状態でなくなってしまうので、それを修正したいんですが、方法が分かりません(;_:)

現在は、グリッドのフォーカスイベントに
MSFlexGrid1.SelectionMode = flexSelectionByRow

を設定しているだけです。

以上、よろしくお願いいたしますm(__)m

Aベストアンサー

こんにちは。
以下を追加してみたらどうですか?

'行を選択
MSFlexGrid1.Row = 1
MSFlexGrid1.RowSel = 1

'列を選択
MSFlexGrid1.Col = 1
MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1

Q表を表示するコントロールについて

いつもお世話になっております!

VB6.0でデータベースからデータを抽出したものを
表形式で表示したいと思っています。
表示するコントロールとしてはどういうものが
適していると思いますか?
「これがいいと思うよ~」「これが使いやすい!」などの
意見を聞かせて下さい!
宜しくお願いします。

あと出来れば下の3つの要望に
そっているものが良いです。
・データの編集は出来なくて良いのです
・データのコピーは出来た方が好ましいです
・あとから印刷機能も付けたいと思っています

Aベストアンサー

DBのデータを表形式に表示するのであれば
1.DbGrid(VBに標準でついてるコントロール)
2.TrueDBGrid(GrapeCity製:上記の製品版)
3.PerfectGrid(使ったことないのでなんとも)
4.Spread(GrapeCity製:個人的にはよく使用します)
などなどいろいろあります。
個人的には4のSpreadOCXを好んで使用しています。長年使っているので使い勝手がいいのです。が、データ量が多いとちょっと・・・

参考URL:http://www.grapecity.com/japan/

Qデータグリッドビューの一番最初の行に列を追加したい

お世話になっています。
VB2005です。
タイトル通りなのですが、DataGridViewの一番最初の列(0列目)に列を追加したいのです。
DataGridView1.Columns.Add()
では一番最後の行に追加されてしまいます。

ヘルプやネット上を見てもわからず・・・
どなたかご存じの方教えてください。

Aベストアンサー

こんばんは。

AddではなくInsertを使います。

TextBoxColumnを追加します。

Dim TextBoxColumn As New DataGridViewTextBoxColumn
Me.DataGridView1.Columns.Insert(0, TextBoxColumn)

でとりあえず追加できます。

後はヘッダーに項目名を設定したり、列幅を設定し足してください。


人気Q&Aランキング