none
メイン/サブフォームの連携について RRS feed

  • 質問

  • 今回もよろしくお願いします。

    VB2005とAccess2003で開発しています。

    フォームに、データテーブル1の内容をテキストボックスで配置して、テーブル2をDataGridViewにして配置しています。メインがテーブル1、サブがテーブル2です。

    メインには、日付と伝票№があり、サブにも日付と伝票№があるのでDataGridViewにフォーカスが移ったときに、自動的に日付と伝票№を表示するようにしています。

    DataGridViewのエンターイベントに下記のコードを書いてます。

    Private Sub DataGridView1_Enter( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.Enter


                   Table1BindingSource.EndEdit()


        End Sub

    それで、動作確認したところ、同じ日付の1回目の伝票はDataGridViewに問題なく、日付と伝票№が表示されるのですが、同じ日付で2回目に伝票№を変えて入力しようとすると、DataGridViewに伝票№は入るのですが、日付が入りません。新しい伝票を表示させる時に何か抜けている可能性があるのでしょうか?

    メインの日付はDateTimePickerで表示しています。

    自動表記するための別の方法がありましたら教えてください、よろしくお願いします。

     

     

    2006年11月10日 2:25

回答

  •  momo-yo さんからの引用

    メインには、日付と伝票№があり、サブにも日付と伝票№があるのでDataGridViewにフォーカスが移ったときに、自動的に日付と伝票№を表示するようにしています。

     ここを もう少し詳しく書いて頂けますか
    サブとメインを連結させてると思いますが DataGridViewにフォーカスが移る時というのは DataGridViewから行を選択したときに テキストボックスに選んだ行の日付と伝票Noを表示させるということですか

     momo-yo さんからの引用

    それで、動作確認したところ、同じ日付の1回目の伝票はDataGridViewに問題なく、日付と伝票№が表示されるのですが、同じ日付で2回目に伝票№を変えて入力しようとすると、DataGridViewに伝票№は入るのですが、日付が入りません。新しい伝票を表示させる時に何か抜けている可能性があるのでしょうか?

    ここの伝票Noを変えて入力するのは テキストボックスのことですか
    テキストボックスに入力しても DataGridViewに反映されないと 読み取れたのですが 違いますか?

    2006年11月10日 2:52
  • かずbooさんこんにちは。返信ありがとうございました。

    メインには、日付と伝票№があり、サブにも日付と伝票№があるのでDataGridViewにフォーカスが移ったときに、自動的に日付と伝票№を表示するようにしています。

    >DataGridViewから行を選択したときに テキストボックスに選んだ行の日付と伝票Noを表示させるということですか。

    おっしゃるとおりです。行を選択したら日付・伝票№が表示できるようにしてあります。

    >ここの伝票Noを変えて入力するのは テキストボックスのことですか
    テキストボックスに入力しても DataGridViewに反映されないと 読み取れたのですが 違いますか?

    伝票№のテキストボックスには、NULL値を認めていないので自動表示されるように下記のようにプログラムをしました。同じ日付で伝票№を更新して入力するとき、伝票№はDataGridViewに入ります。DateTimePikerに自動で今日の日付が表示されるようにしてあるのですが、その日付がDataGridViewに反映されません。

     Private Function GetLastNumber() As Integer  '最終の伝票番号下2桁取得
            '今日の日付
            Dim key As String
            key = Format(Today(), "yyyyMMdd")

            '今日の伝票を抽出
            Dim dv As New DataView
            dv.Table = DataSet1.test
            dv.RowFilter = "伝票№ LIKE '" & key & "%'"
            dv.Sort = "伝票№"

            '最終行番号
            Dim rnum As Integer
            rnum = dv.Count - 1

            '伝票番号
            If rnum < 0 Then
                '該当する伝票がないとき
                GetLastNumber = 0
            Else
                '一番新しい伝票の番号
                GetLastNumber _
                    = Val(Microsoft.VisualBasic.Right(dv(rnum)("伝票№"), 2))
            End If

    最初の質問に記載したコードが、Autoincrementプロパティと関係があるかもしれません。伝票№は自動で更新されますが、日付は同じ日に何枚も伝票を入力するので、何の設定もしていません。

    どうやってやったらいいかわかりませんが、DataGridViewに自動で表示するには別の方法がよいのかも?と思っています。

     

    2006年11月10日 4:38
  •   入力した 日付とNOはどうやって DataGridViewに反映させてるんですか?
    テーブル2とDataGridViewを関連付けてるなら テーブル2にデータを追加すれば反映されると思うのですが
     最初のコードは何の為に入れてるんですか?

     テキストボックスもテーブル2と関連付けてるのかなと思ったのですが それだと変更はできますが データを追加するのは 少しややこしいです。
    このテキストボックスはデータ追加のため それとも変更のため どちらもかな?

     もしも 追加の為 或いはどちらもの場合ですと テーブルと関連付けたままでは 使いづらいかも
    そんな場合は 私の場合 データを表示だけさせて すぐに関連を切り離すようにしています そして追加等のときは テーブルに直接追加してから関連を繋ぎ すぐに切るというのを繰り返してますが そんな感じのことがしたいのではないのかな?

    2006年11月10日 10:04
  • 追伸、 

    Me.TextBox1.DataBindings.Add(New System.Windows.Forms.Binding("Text", データセット, "データセット.テーブル1"))

     Me.TextBox1.DataBindings.Clear()

    この2行で 接続、切断が完了します(接続を設定したときに自動で作成されるコードを見にいけば コードが盗めます)

    2006年11月10日 12:28

すべての返信

  •  momo-yo さんからの引用

    メインには、日付と伝票№があり、サブにも日付と伝票№があるのでDataGridViewにフォーカスが移ったときに、自動的に日付と伝票№を表示するようにしています。

     ここを もう少し詳しく書いて頂けますか
    サブとメインを連結させてると思いますが DataGridViewにフォーカスが移る時というのは DataGridViewから行を選択したときに テキストボックスに選んだ行の日付と伝票Noを表示させるということですか

     momo-yo さんからの引用

    それで、動作確認したところ、同じ日付の1回目の伝票はDataGridViewに問題なく、日付と伝票№が表示されるのですが、同じ日付で2回目に伝票№を変えて入力しようとすると、DataGridViewに伝票№は入るのですが、日付が入りません。新しい伝票を表示させる時に何か抜けている可能性があるのでしょうか?

    ここの伝票Noを変えて入力するのは テキストボックスのことですか
    テキストボックスに入力しても DataGridViewに反映されないと 読み取れたのですが 違いますか?

    2006年11月10日 2:52
  • かずbooさんこんにちは。返信ありがとうございました。

    メインには、日付と伝票№があり、サブにも日付と伝票№があるのでDataGridViewにフォーカスが移ったときに、自動的に日付と伝票№を表示するようにしています。

    >DataGridViewから行を選択したときに テキストボックスに選んだ行の日付と伝票Noを表示させるということですか。

    おっしゃるとおりです。行を選択したら日付・伝票№が表示できるようにしてあります。

    >ここの伝票Noを変えて入力するのは テキストボックスのことですか
    テキストボックスに入力しても DataGridViewに反映されないと 読み取れたのですが 違いますか?

    伝票№のテキストボックスには、NULL値を認めていないので自動表示されるように下記のようにプログラムをしました。同じ日付で伝票№を更新して入力するとき、伝票№はDataGridViewに入ります。DateTimePikerに自動で今日の日付が表示されるようにしてあるのですが、その日付がDataGridViewに反映されません。

     Private Function GetLastNumber() As Integer  '最終の伝票番号下2桁取得
            '今日の日付
            Dim key As String
            key = Format(Today(), "yyyyMMdd")

            '今日の伝票を抽出
            Dim dv As New DataView
            dv.Table = DataSet1.test
            dv.RowFilter = "伝票№ LIKE '" & key & "%'"
            dv.Sort = "伝票№"

            '最終行番号
            Dim rnum As Integer
            rnum = dv.Count - 1

            '伝票番号
            If rnum < 0 Then
                '該当する伝票がないとき
                GetLastNumber = 0
            Else
                '一番新しい伝票の番号
                GetLastNumber _
                    = Val(Microsoft.VisualBasic.Right(dv(rnum)("伝票№"), 2))
            End If

    最初の質問に記載したコードが、Autoincrementプロパティと関係があるかもしれません。伝票№は自動で更新されますが、日付は同じ日に何枚も伝票を入力するので、何の設定もしていません。

    どうやってやったらいいかわかりませんが、DataGridViewに自動で表示するには別の方法がよいのかも?と思っています。

     

    2006年11月10日 4:38
  •   入力した 日付とNOはどうやって DataGridViewに反映させてるんですか?
    テーブル2とDataGridViewを関連付けてるなら テーブル2にデータを追加すれば反映されると思うのですが
     最初のコードは何の為に入れてるんですか?

     テキストボックスもテーブル2と関連付けてるのかなと思ったのですが それだと変更はできますが データを追加するのは 少しややこしいです。
    このテキストボックスはデータ追加のため それとも変更のため どちらもかな?

     もしも 追加の為 或いはどちらもの場合ですと テーブルと関連付けたままでは 使いづらいかも
    そんな場合は 私の場合 データを表示だけさせて すぐに関連を切り離すようにしています そして追加等のときは テーブルに直接追加してから関連を繋ぎ すぐに切るというのを繰り返してますが そんな感じのことがしたいのではないのかな?

    2006年11月10日 10:04
  • かずbooさん、こんばんは。返信ありがとうございました。

    色々調べたんですが、リレーションがきちんと設定できていなかったみたいです。最初のコードは、参考書にDataGridViewに自動で値を入力する、という項目に載っていたんですが、使い方を間違っているみたいなのでもう一度検証してみます。

    アドバイスにあるとおり、使いづらい状態になってますので、作成しなおします。表示をさせて、関連を切り離すという事をしたら良いのですね。ありがとうございました。

     

    2006年11月10日 12:13
  • 追伸、 

    Me.TextBox1.DataBindings.Add(New System.Windows.Forms.Binding("Text", データセット, "データセット.テーブル1"))

     Me.TextBox1.DataBindings.Clear()

    この2行で 接続、切断が完了します(接続を設定したときに自動で作成されるコードを見にいけば コードが盗めます)

    2006年11月10日 12:28
  • かずbooさん、返信ありがとうございました。

    コードを教えていただいてありがとうございました。なんとか表示させることができました。

    最初に投稿した件ですが、自分で作ったFormを検証したところ、日付をDateTimePikerで表示させていたのですが、データを更新すると、DateTimePikerがなぜかNull値になっていたため、とわかりました。日付データが表示されているのに、Null値になっていました。それで、リンクするDataGridviewに反映されていなかったみたいです。(Null値だから反映していなかった)

    フォームをロードしたときと、更新の時に

        DateTimePiker1.text=Today()

    としていたんですが、

        DateTimePiker1.text=Now

    としたら、Null値にならずにちゃんとDataGridViewの日付のところに反映されるようになりました。 Nowの3文字にたどり着くまで半日かかってしまいました

    これから、かずbooさんに教えていただいたデータの接続と、切断のテクニックをもっと勉強して使いやすいFormを作りたいと思います。今回もありがとうございました。

     

    2006年11月11日 13:14