none
クラスのデータのやり取り RRS feed

  • 質問

  • VB2008 Vistaで勉強をしております

    年を取ってからの勉強でなかなか思うように進まないのでどなたかが指導をお願いたします

    数冊の参考書を参考してから何とかListViewにDataSetを使用してデータを表示させることができております

    フォームが1~6までありそれぞれのファームにはListViewを使用して同じデータ表示をしております

    質問ですが、どのフォームもListViewに同一のデータを表示するのをクラスを使用することでプログラムの簡素化ができるのではないかと思いいろいろやってみるのですがクラス内でにどうしたらDataSetを使ってデータ表示をすることができるのかが分かりません

    また、その時に表示の設定数(最小・最大数を)をクラスに渡す方法及び表示時にあるデータのカウントをしておりその数値をクラスから帰ってから表示をしたいのですが方法がわかりません

    質問が分かりにくいのではないかと思いますがよろしくご指導をお願いいたします

    2015年10月13日 5:00

回答

  • Dim 結果 = ユーティリティ.集計(5, 10, Me.TESTDataSet.TEST)


    例えば以下のようなクラスを作成します。

    Public Class ユーティリティ
    
        Public Shared Function 集計(最小値 As Integer, 最大値 As Integer, 集計Table As DataTable)
    
            集計 = #集計結果をセットして下さい。
        End Function
    
    End Class

    結果を返すには、関数名に結果をセットします。

    使う方は、例えば以下のように使います。

    Dim 結果 = ユーティリティ.集計(5, 10, HawsuDataSet1.loto6)

    上記の集計関数は静的メソッドで実現しています。静的メソッドを実現するには、他にモジュールを利用する方法もあります。
    静的メソッドではなく、つまりSharedを使わない場合は、Newを利用してインスタンスを生成し、そのインスタンスにおける集計関数を使うことになります。

    なお、参考として、このような集計を行うにはLINQが便利に使える場合があります。LINQを利用した場合、集計が1行のコードで済んでしまうことも多々あります。今すぐは無理かもしれませんが、そのような便利なLINQという機能があることも、頭の隅に入れておかれると良いと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年10月14日 0:18
    • 回答としてマーク 星 睦美 2015年10月21日 5:37
    2015年10月13日 7:28
    モデレータ
  • > その時に、クラスへのDataSet・最大数等の引き渡し方法、カウント結果の数値の
    > フォームへの渡し方がよくわかりません

    まず最初に Form1 を初期化しそこで TableAdapter を使って DataSet を生成した後、Form2 ~ Form6 を初期化してそれらに Form1 で生成した DataSet への参照(プラス「最大数等」の情報?)を渡したいということでしょうか?

    そしてその次の課題として trapemiya さんが提案されたような各クラスから共通で使える静的メソッドを実装したいということでしょうか?

    であれば、まず最初の課題を解決する必要があるわけですが、それは Form2 ~ Form6 に DataSet + 最大数等を引数に持つコンストラクタを追加し、Form2 ~ Form6 を初期化する際にそのコンストラクタを使って渡すようにしてはいかがですか。

    • 回答としてマーク 星 睦美 2015年10月21日 5:37
    2015年10月14日 2:09

すべての返信

  • 実現されたいことをもう少し具体的に教えて下さい。

    現在は、フォーム1から6の表示の元になっているDataSetを各フォームで作成されていると思うのですが、その手順をクラスを作成してそこにまとめたいということでしょうか? そのDataSetはどのように作成されているのでしょうか? データーベースからでしょうか? もし、データーベースであればTableAdapterというクラスを自動生成する機能をVB2008は持っていますので、それを使うと便利です。
    データーベースではなく、独自にDataSetを作成されていたとしても、それを作成、管理するクラスを作成されると良いでしょう。
    その上で、そのDataSetを各フォームから共通で使いたい場合、それを1つのインスタンスとして提供する機能をクラスに持たせても良いと思います。デザインパターン的にはシングルトンと呼ばれる仕組みがあります。

    いずれにしましても、もう少し具体的に説明していただくと、的確なアドバイスが得られやすいと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年10月13日 5:36
    モデレータ
  • こんにちは。

    思いつくのは、ひとつは以下のように共通クラスへフォームまたはListViewなどのインスタンスを渡して現在実現できている相当の機能(DataSetを設定)を共通クラス側で行うことでしょうか。その際に最少、最大も引数などで渡して実装、ByRefなどで特定データの件数を返す、とかでしょうか。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14372&forum=7

    もしくは以下のようにフォームの基底クラスを作成して、そこで共通処理を行うか、でしょうか。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/324winbaseform/winbaseform.html

    2015年10月13日 5:37
    モデレータ
  • 説明不足で申し訳ございませんデータベースを使用してTableAdapter・DataSetをを各フォームに設定しております

    フォーム1~6にはListView(同じデータ)を設定してデータ表示をしております

    各フォームでのListViewの表示データの違いは最小・最大数の設定の違いでだけで、その指定した数値内のデータの検索カウント処理を行っております

    ご指摘の通りにクラスでまとめて処理をするときにクラスに飛ばす方法及びクラスでのTableAdapter・DataSetの受け方フォーム上で指定した周知の渡し方・カウントした数値の受け取り方がよくわかりません

    ListView1の表示

     Do
                For ii = 0 To 42
                    If hawusu(ii) = shiftMaximum Then
                     ListView1  .Items.Add(ii + 1)
                        ListView1.Items(n).SubItems.Add(hawusu(ii))
                        n = n + 1
                    End If
                Next
                shiftMaximum = shiftMaximum - 1
                j = j + 1
            Loop Until j = 42

    集計

     Dim i As Integer
            setHawsuNumber = txtHs1.Text + txtHs2.Text + txtHs3.Text + txtHs4.Text + txtHs5.Text + txtHs6.Text
            firstHawsu = 0
            'TextDataFormat(setHawsuNumber, "収穫検索")

            With HawsuDataSet1.loto6
                For i = 0 To recodCount - 1
                    aryFirstHawsu = .Rows(i)("hawsuNo1") + .Rows(i)("hawsuNo2") + .Rows(i)("Nohawsu3") + .Rows(i)("hawsuNo4") + .Rows(i)("hawsuNo5") + .Rows(i)("hawsuNo6")
                    If aryFirstHawsu = setHawsuNumber Then
                        firstPrize = firstPrize + 1
                    End If
                Next
            End With
            txtPnize1.Text = Format(firstPrize, "####0")

    各フォームでListView1表示・集計を行っております

    この同じ処理をクラスで処理をすれば各フォーム上のプログラムが簡素化されるのではないかと思い質問をさせていただきました

    その時に、クラスへのDataSet・最大数等の引き渡し方法、カウント結果の数値のフォームへの渡し方がよくわかりません

    基礎がないのと、理解不足で前に進みません

    都合のよい質問で申し訳ないのですがご指導をお願いします

    2015年10月13日 6:41
  • Dim 結果 = ユーティリティ.集計(5, 10, Me.TESTDataSet.TEST)


    例えば以下のようなクラスを作成します。

    Public Class ユーティリティ
    
        Public Shared Function 集計(最小値 As Integer, 最大値 As Integer, 集計Table As DataTable)
    
            集計 = #集計結果をセットして下さい。
        End Function
    
    End Class

    結果を返すには、関数名に結果をセットします。

    使う方は、例えば以下のように使います。

    Dim 結果 = ユーティリティ.集計(5, 10, HawsuDataSet1.loto6)

    上記の集計関数は静的メソッドで実現しています。静的メソッドを実現するには、他にモジュールを利用する方法もあります。
    静的メソッドではなく、つまりSharedを使わない場合は、Newを利用してインスタンスを生成し、そのインスタンスにおける集計関数を使うことになります。

    なお、参考として、このような集計を行うにはLINQが便利に使える場合があります。LINQを利用した場合、集計が1行のコードで済んでしまうことも多々あります。今すぐは無理かもしれませんが、そのような便利なLINQという機能があることも、頭の隅に入れておかれると良いと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年10月14日 0:18
    • 回答としてマーク 星 睦美 2015年10月21日 5:37
    2015年10月13日 7:28
    モデレータ
  • ご返事ありがとうございました

    頑張ってやってみたいと思います(LINQも合わせて勉強をしたいと思い増す)

    2015年10月13日 21:08
  • フォーラム オペレーターの星 睦美です。古希を前にして さん、投稿ありがとうございます。

    フォーラム ユーザーからの回答が参考になりましたら、回答者への良いフィードバックになりますので回答者から[回答としてマーク] をお願いします。

    ・フォーラムのヘルプ


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年10月14日 0:21
  • > その時に、クラスへのDataSet・最大数等の引き渡し方法、カウント結果の数値の
    > フォームへの渡し方がよくわかりません

    まず最初に Form1 を初期化しそこで TableAdapter を使って DataSet を生成した後、Form2 ~ Form6 を初期化してそれらに Form1 で生成した DataSet への参照(プラス「最大数等」の情報?)を渡したいということでしょうか?

    そしてその次の課題として trapemiya さんが提案されたような各クラスから共通で使える静的メソッドを実装したいということでしょうか?

    であれば、まず最初の課題を解決する必要があるわけですが、それは Form2 ~ Form6 に DataSet + 最大数等を引数に持つコンストラクタを追加し、Form2 ~ Form6 を初期化する際にそのコンストラクタを使って渡すようにしてはいかがですか。

    • 回答としてマーク 星 睦美 2015年10月21日 5:37
    2015年10月14日 2:09