VB6.0 DataGridでのfirstRowの設定について

このQ&Aのポイント
  • VB6.0でデータベースの内容を更新するプログラムを作成しています。
  • データベースの内容をデータグリッドに読み込み、選択した行のレコードを修正・更新する方法について教えてください。
  • FirstRowプロパティを使うことでブックマークの位置を退避し、ブックマークを元通りに戻すことができますが、この方法ではグリッドの表示が変化してしまいます。他の方法で正しくブックマークの位置を管理する方法があれば教えてください。
回答を見る
  • ベストアンサー

VB6.0 DataGridでのfirstRowの設定について

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_ta
  • お礼率64% (65/101)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Refresh後に Bookmark > FirstRowの順に処理するのではなく、FirstRow > BookMarkの順に処理すればいいようですよ FirstRowの復元は FirstRowに代入するのではなく、Bookmarkに代入してやるようにしてみましょう 保存しておく FirstRowはVariant型のほうがよさそうです AdoD.Refresh Dgd.Bookmark = varFirstRow Dgs.Bookmark = varRow

q_ta
質問者

お礼

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

関連するQ&A

  • VB2008・DataGridの表示について

    フォーム上にDataGridを設置してsqlcompactで作られたテーブルのデータを表示しようとして 以下のソースを実行すると、エラーになり表示できませんでした。 もし、原因がわかるかたがいらっしゃいましたら教えてくださると助かります。 表示するにあたり、テーブルの特定のカラムだけ表示して、ヘッダーを編集したい。 テーブルの全レコードではなくて対象レコードのみを表示 Dim cn As New System.Data.SqlServerCe.SqlCeConnection Dim SQL As System.Data.SqlServerCe.SqlCeCommand Dim db_sql As String ' テーブルスタイルを生成する Dim dgStyle As DataGridTableStyle = New DataGridTableStyle() dgStyle.MappingName = "表示用テーブル" ' 列スタイルを生成し、プロパティを設定する Dim col(4) As DataGridTextBoxColumn col(0) = New DataGridTextBoxColumn() col(0).HeaderText = "商品コード" col(0).MappingName = "商品コード" col(0).Width = 50 col(1) = New DataGridTextBoxColumn() col(1).HeaderText = "商品名" col(1).MappingName = "商品名" col(1).Width = 100 ' 列スタイルをテーブルスタイルに追加する dgStyle.GridColumnStyles.Add(col(0)) dgStyle.GridColumnStyles.Add(col(1)) ' テーブルスタイルをグリッドに追加する Me.DataGrid_Display.TableStyles.Clear() Me.DataGrid_Display.TableStyles.Add(dgStyle) 'DBのパスをセットしてオブジェクト化 cn.ConnectionString = "Data Source=" & DB_PATH & ";Password=" & DB_PASSWORD & ";Persist Security Info=True;" SQL = cn.CreateCommand 'データグリッドを表示する Dim dbadp As System.Data.SqlServerCe.SqlCeDataAdapter Dim dbtabl As DataTable Dim aa As DataSet db_sql = "SELECT syohinno, syohinryaku, suryo1, suryo2, suryo3 FROM porsj05_tempo ORDER BY date DESC" dbadp = New SqlCeDataAdapter(db_sql, cn) dbtabl = New DataTable dbtabl.Locale = System.Globalization.CultureInfo.InvariantCulture dbadp.Fill(dbtabl) Me.DataGrid_Display.DataSource = dbadp Me.DataGrid_Display.Refresh() エラー箇所 Me.DataGrid_Display.DataSource = dbadp エラー内容 Complex DataBinding は IList または IListSource のどちらかをデータソースとして受け入れます。 'System.ArgumentException' の初回例外が System.Windows.Forms.dll で発生しました。

  • VB2005 DataGrid1初期化について

    はじめまして。 VB2005 DataGrid1の初期化について質問があります。 下記処理を実行すると、 一度目のFormBを表示ではDataGridに正しく表示されます。 FormBにてボタンEndを押し、再度FormBを表示すると DataGridの表示が化けてしまいます。 (縦・横のスクロールバーが表示されなくなり、  列・行の幅も小さくなっている) DataGrid自体は何も設定していなく、 表示内容に対して自動でDataGridを調整してくれる ものだと思っておりました。 何か初期化(Me.DataGrid1.Refresh)などが問題なので しょうか? 長文になりましたが、何か少しでも解決策をお願いします。 Private Sub Form_Load 'FormBを表示  FormB.ShowDialog  '再度FormBを表示  FormB.ShowDialog Exit Sub Private Sub FormB_Load  Dim Aclone As New ADODB.Recordset  'Aclone設定  If Aclone .State = ADODB.ObjectStateEnum.adStateOpen Then   Aclone .Close()  End If  'DataGrid初期化  Me.DataGrid1.Refresh()  'XXXX(接続・テーブル情報)の内容をAcloneにセット)  Aclone = XXXX.clone  'AcloneをDataGridにセット  Me.DataGrid1.DataSource = Aclone Exit Sub Private Sub FormB_Btn_End  Me.Hide Exit Sub

  • VB Forから抜ける

    Data1(1, 1) = "りんご" Data1(1, 2) = "みかん" Data1(2, 1) = "なし" Data1(2, 2) = "オレンジ" Data2(1, 1) = "バナナ" Data2(1, 2) = "みかん" Data2(2, 1) = "なし" Data2(2, 2) = "いちご" -------------------- Dim c, i As Integer For c = 1 To 2 For i = 1 To 2 If Data1(c, i) <> Data2(c, i) Then MessageBox.Show("異なります") GoTo goto1 End If Next Next goto1: ----------------- 言語 VB.NET Data1とData2 の中身が異なればアラートを出す。 (複数異なっていても1度のみアラートを出す) さて これを「GOTO」を使わないでする方法ってあるんでしょうか? 「EXIT Sub」はgoto1:の下にもコードがあるので使えません。 GoTo goto1を Exit For にしても 「i」 のループが抜けるだけです。 これを「C」のループを抜けるようなコードってあるんでしょうか?

  • VBでファイル読み込み

    VBであるところにあるCSVファイルのデータを読み込みエクセルへ変換出力したいのですが教えてください。コモンダイアログボックス(?)と言うものを使って作成したいのです。よろしくお願いします。 がんばってやってみたのですがわかりません。教えてください。 Private Sub Command1_Click() Dim gnum(25), tensuu(32, 99) Dim sougouten(99), heikin(99), gouhi$(99) 'ファイルを開く On Error GoTo ErrHandler 'コモンダイアログボックス CommonDialog1.CancelError = True CommonDialog1.Filter = "すべてのファイル (*.*)|*.*|" _ & "テキスト ファイル (*.txt)|*.txt|バッチ ファイル (*.bat)|*.bat" CommonDialog1.FilterIndex = 2 CommonDialog1.ShowOpen With CommonDialog1 .FileName = "" .ShowOpen End With Exit Sub ErrHandler: ' ユーザーが [キャンセル] ボタンをクリックしました。 End Sub

  • シード権を省いたヒートランダム分け

    A1は名前が並んでいます。 B1はシード権取得の名前です。 C1はA1セルの人数に合わせてヒート分けする数を入力します。1つのヒートに4名前後です。 Dセル以降はシード権を省いたヒート分けします。 下記はA1セルからランダムにヒート分けしたプログラムです。 シード権を省いたヒートランダム分けをするにはどうしたら良いでしょうか? 宜しくお願いします。 Sub heatrandom() Dim Total As Integer Dim TableCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Dim FirstRow As Long, LastRow As Long FirstRow = 2 LastRow = Cells(Rows.Count, 1).End(xlUp).Row Total = LastRow - FirstRow + 1 TableCnt = Range("B2").Value Data1 = Range(Cells(FirstRow, 1), Cells(LastRow, 1)).Value ReDim Data2(1 To Total) Randomize For i = Total To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TableCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub

  • Excel 行番号を調べる

    Excel で違うブックの表から 入力した文字と同じセルを調べ その隣のセルの文字を表示させたいのですが (検索するときはブックを開いておいてしてます。) lookupとかを使ってもなかなか上手く出来ず vbaを使って表示させようと思い 下のようなスクリプトを作ったのですが 別のブックの表が3万行ぐらいあるので for next でループさせていたら少し遅いので もう少し早くならないかと思っています。 machとかでぱっと行番号が解るようにしたいのですが 2日悩んだのですが、出来ませんでした。 で、皆様のお力を借りようと思い。 ご助力を宜しくお願いします。 Function slookup(Pno As Variant, bname As Variant, sname As Variant, Pli As Byte, searchli As Byte) As Variant Dim slow As Long Dim I As Long Dim lrow As Long On Error GoTo Fault: lrow = Workbooks(bname).Worksheets(sname).Range("A65536").End(xlUp).Row For I = 1 To lrow If Workbooks(bname).Worksheets(sname).Cells(I, Pli) = Pno Then slow = I Exit For End If Next I slookup = Workbooks(bname).Worksheets(sname).Cells(slow, searchli) If slookup = 0 Then slookup = "" 'スクリプトを抜ける Exit Function Fault: slookup = "" End Function

  • VBからOracle接続が出来ません。

    こんにちは。 VisualBasic6.0EnterprizeEdition から Oracle8i の接続を試みております。 接続が出来ません。コードは本のものをそのまま書いたので、間違いはないと思います。 Private Function OraOPN() As Boolean Dim strDB As String * 30 'サービス名 Dim strUID As String * 30 'ユーザー名 Dim strPWD As String * 30 'パスワード Dim strUP As String Dim strMSG As String 'エラー時のメッセージ On Error GoTo Ora_Error strDB = Trim(txtLogon(2).Text) strUID = Trim(txtLogon(0).Text) strPWD = Trim(txtLogon(1).Text) strUP = strUID & "/" & strPWD strMSG = "データベースへの接続ができません" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(strDB, strUP, &H1&) OraOPN = True Exit Function Ora_Error: OraOPN = False Call MsgBox(strMSG & vbCrLf & " システム管理者に連絡してください" & vbCrLf & vbCrLf & "", vbCritical) End End Function 以上のコードで、接続できません。本に書いてあるとおりそのままのコードです。オラクルサーバとVBプログラムは同一マシン上に置いてあります。 私は、Java専門でVBはわかりません。誰かわかる方がいたら、教えてください。よろしくお願いします。

  • VBのDataGridで見られるエラーについての質問

    こんにちはtmgmです。 VisualBasic6.0のデータベース連携プログラムで困っています。 ACCESSであらかじめ.mdbを作成しておいて、そのDBに接続し、DataGridにmdbのデータを表示するという単純なプログラムなんですが、どうしても決まったエラーが出てしまいます。 下記プログラムの、Set D_GRID.DataSource = RECOでいつもエラーになります。 エラー内容は「行セットにはブックマークを指定できません」です。 つまりはこのエラーの意味がわからないので困っています。 分かる方、ご返答よろしくお願いします。 <補足> プログラムはこんな感じです。 ---------------------------------------------------------------------------- Private Sub Form_Load() '接続の定義 Dim CONN As adodb.Connection 'レコードセットの宣言 Dim RS 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 "データベース接続に成功しました。", vbOKOnly + vbInformation, "VBプログラミング" Set RECO = New Recordset With RECO .ActiveConnection = CONN .Source = "T_TEST" .CursorType = adOpenDynamic .LockType = adLockOptimistic .Properties("IRowsetIdentity") = True .Open End With Set D_GRID.DataSource = RECO   Msgbox "データの取得に成功しました。", vbOkOnly + vbInformation, "VBプログラミング" End Sub

  • DataGridでエラーになる

    こんにちわ。 現在「Microsoft Visual Basic 2008 Express Edition」と「Microsoft SQL Server 2005」で開発を始めた初心者です。 テーブルの指定範囲のレコードをDataGridに表示したいため、ホームページのサンプルを参考にコーディングしたのですが、 エラーとなってしまいます。 フォームには、ツールボックスから「DataGridView」をドラックして貼り付けてあります。 どうすれば動きますでしょうか?ご教授お願いします。 <エラーの内容> 「'TableStyles'は'System.Windows.Forms.DataGridView'のメンバではありません。」 <参考ホームページ> http://park5.wakwak.com/~weblab/selectRange.html ---------------------------------------------------------------- Imports TESTPG.DbUtil Imports System.Data.OleDb Public Class frm社員マスタ一覧 Inherits System.Windows.Forms.Form Private Sub BTN_検索ボタン_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_検索ボタン.Click '------------------------------------------- ' レコードを取得し、データグリッドに表示する '------------------------------------------- Try 'テーブルスタイルを生成する Dim ts As New DataGridTableStyle() 'マップ名を指定する ts.MappingName = "社員テーブル" '新しい列スタイルの作成 Dim cs(2) As DataGridTextBoxColumn cs(2) = New DataGridTextBoxColumn() 'マップ名を指定する cs(2).MappingName = "Column1" '列ヘッダに表示される文字列 '1列目:社員コード cs(0) = New DataGridTextBoxColumn() cs(0).HeaderText = "コード" cs(0).MappingName = "社員コード" cs(0).Width = 40 cs(0).Alignment = HorizontalAlignment.Center '2列目:社員氏名 cs(1) = New DataGridTextBoxColumn() cs(1).HeaderText = "社員氏名" cs(1).MappingName = "社員氏名" cs(1).Width = 90 cs(1).Alignment = HorizontalAlignment.Left '3列目:社員カナ名 cs(2) = New DataGridTextBoxColumn() cs(2).HeaderText = "社員カナ名" cs(2).MappingName = "社員カナ" cs(2).Width = 130 cs(2).Alignment = HorizontalAlignment.Left '列スタイルをテーブルスタイルに追加する ts.GridColumnStyles.AddRange(cs) 'テーブルスタイルをグリッドに追加する dgrSyain.TableStyles.Clear() ← ここでエラー dgrSyain.TableStyles.Add(ts) ← ここでエラー '************************************* 'SQL文の設定 'データを取得する 'データをバインドする '************************************* Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub End Class

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class