Form1,Form2があって、Form1にはデータグリッドでデータベースに接続したレコードを表示しているんですが、カレントレコードの部分をコマンドボタンを押した時にForm2の各テキストボックスに表示してそれを編集や削除処理などを行って、Form1のグリッドに反映させたいと思っているのですが、何か良い方法はありませんでしょうか?
>一覧データの編集を別フォームで行うには?
を参照してください。
後半の部分についてはわかりましたが、カレントコードの部分をボタンをクリックした時に別フォームに表示する方法がわかりません....。カレントレコードのデータ抽出はどうすればいいのですか?本などを見てもプログラムの中に直接文字列を記述して、削除や修正、追加などをされてますが、そうではなく、カレントレコードをの情報を抽出したいのです。テキストボックスならText1.textなどのプロパティを利用して抽出できるのですが。データベースのカレントコードはユーザの操作によっていつも場所が変わってしまうので、そこのところのうまい方法がわかりません。どうか、よろしくお願いします。
…そ…そりわ、もしかしてデータグリッドコントロールの使い方そのものが
分からないと?(汗)とりあえずヘルプは見てくださいね?。例えばこんな例も載ってます。
データ グリッド コントロールからの値の戻り
データ グリッド コントロールがデータベースに接続された後は、ユーザーがクリックしたセルを監視できます。この場合、Click イベントではなく、RowColChange イベントを次のように使用します。
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
' ユーザーがクリックしたセルのテキスト、行、および列を印刷します。
Debug.Print DataGrid1.Text; DataGrid1.Row; DataGrid1.Col
End Sub
このイベントで Row と Column を覚えておくのが一番簡単でしょうか?。
オブジェクトブラウザなんかで使用するコントロールにどんなイベントや
プロパティやメソッドがあるか検索するのは基本です。頑張ってください。
一応やってみたのですが、Rowを使っても、Form1のDataGridでスクロールした場合、例えば表示される行が5列だとすると、違うレコードでも5の値を返してしまうので、レコードの値の取得は確実にできません。カレントレコード固有の数値を取得する方法はないのでしょうか?AbsolutePositionプロパティでそのような事ができそうなのですが、いくらやってもうまくいきません。一応、カレントレコードの数値を取得して、変数に代入してForm2でそのカレントレコードの変数を代入すればいいのかなと考えていますが、そのカレントレコードの数値を取得する方法がわからないのでどうしようもありません。
ちなみにForm1のプロシージャをPublicにすれば、そのままForm2のテキストボックスに表示されるレコードと連動するのですが、Form1ではレコードのすべてを表示させているわけではないので、Form2でForm1にないカラムを取得できないので、その方法も駄目そうです。あらかじめ使わないカラムまでForm1で取得して、データグリッドの幅を縮めて使わないカラムを隠すことはできますが、データグリッドの一番右の列をクリックすると、その隠れている列まで現れるのでちょっと嫌です。その右の列をクリックしても表示しなくするような方法もなさそうなのでどうしたらいいでしょうか?
ああ、ごめんなさいm(__)m
DataGrid って普段使わないからヘルプで調べたんですけどあまりにも自身ありげにヘルプに
書いてあったし、使い込んでなかったです。テストもスクロールするほどデータ表示してませんでした。
.Bookmark が使えそうですかね?。…でもやはり使い込んでません(汗)。
…テストの方はよろしくお願いします(ー人ー)
とりあえずボクは Adodc と DataGrid を Form に貼り付けました。
データの表示は…
Private Sub Form_Load()
Set Me.Adodc1.Recordset = DataBaseSearch ' ←データベースを検索して Recordset を返す関数
Set Me.DataGrid1.DataSource = Adodc1
End Sub
ヘルプにあったように
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
With Me.DataGrid1
Debug.Print .Text; .Row; .Col
Debug.Print Me.Adodc1.Recordset.AbsolutePosition
Debug.Print .Bookmark
Debug.Print ""
End With
End Sub
で必要なデータは取れそうですが…。これで解決しない場合は調査に時間がかかりそうなので
他の方にお任せしようと思います。申し訳ありません。
そもそもボクはデータの表示に DataGrid を使いません。Recordset でデータを取ってきたら
Recordset は Close したいので配列に格納して開放してしまいます。後半のご質問のように、
使ったり使わなかったりするデータがあったり、ある程度変更した後に変更を確定せず、変更点を
すべて破棄したいと思ったりする場合。必要なデータはユーザには見せず、ローカルで保持して
おきます。そこから必要なデータだけ抽出して表示します。ですから表示はもっぱら ListView
ですね(^^;)
今回のような仕様でも、Form1 で必要なデータは裏で全て持っていて、表示させたいデータだけ
表示させます。Form2 の表示も Form1 の裏データからプロパティ渡しで表示させるでしょうか。
'////MainForm コード///////////////////////////////////
Option Explicit
Private Const PrivateTextX As String = "あああ"
' 公開メソッド
Public Function SetSubFormText() As Boolean
SubForm.WriteTextBox = PrivateTextX
End Function
Private Sub btnSubFormShow_Click()
SubForm.Show
End Sub
'//////////////////////////////////////////////////////
'////SubForm コード////////////////////////////////////
Option Explicit
' 公開プロパティ
Public Property Let WriteTextBox(ByVal TextX As String)
Me.Text1.Text = TextX
End Property
Private Sub btnOK_Click()
MainForm.SetSubFormText
End Sub
'//////////////////////////////////////////////////////
いろいろ調べてくれてありがとうございます。でもやっぱりBookmarkでテストしてみましたが、駄目でした。何か色々エラーが出ます。恐らく、Form1でRecordsetを取得して、一度切断してForm2でまた新しいクエリーで取得した場合、Bookmarkが無効になるのではないか?と自分では思っています。だから仕方なくForm1をpublicにしてそれをForm2に引き継いで処理させています。でも難点はDataGridの横幅を縮めて、必要のないカラムを隠しても一番右のカラムをクリックすると表示されてしまうんですよね....。そこをクリックできない方法なども考えて、一番右のカラムの各セルの上にマウスポインタが乗った時にDataGridのEnabledプロパティをFalseにしてみたりしたのですが、それだと、その後の回復ができなくなるんですよね。Form上にマウスポインタが乗った時に機能を回復する方法もあまり思いつきませんし、もしマウスがFormのグレーの色を取得した時にDataGridのEnabledがFalseになるというプログラムが書けるのであればこの問題は強引ではありますが、ひとまず解決するのですが、どういうプロパティや機能を使って書けばいいかわかりません....。
色々試してみたところ、DataGridのプロパティをいじって、表示させたい部分だけ表示させることができました。これで問題は解決しました。ありがとうございました。
ツイート | ![]() |