none
データテーブルの内容をデータグリッドビューに表示させているのですが、それをクリスタルレポートへ引き渡したい RRS feed

  • 質問

  • 現在ラベル印刷プログラムを作成しております

    開発業務を始めて1ヶ月に満たないものです

    VS2010Proとクリスタルレポートバンドル版を使っています

    ラベル印刷を行う取引先情報をデータテーブルにして、それをデータグリッドビューに表示しています
    取引先コードから郵便番号、住所1、住所2、取引先名、印刷枚数、敬称をデータグリッドビューに表示させています
    印刷枚数は直接テキストボックスに入力、敬称についてはラジオボタンを1つ選択し表示させています

    データグリッドビューにデータテーブルの内容を表示させる所まで出来ましたが、
    その内容をクリスタルレポートに表示させ、印刷したく思っていますがそれが出来ません

    ご教授下さい

    フォーム4にクリスタルレポートを表示させています
    データグリッドビューの構成は、以下の通りです

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          
            'プログラムコード 
            Dim Cn As New OleDbConnection
            Dim Command As OleDbCommand = New OleDbCommand
            Dim OLEDBCon As OleDb.OleDbConnection = _
                    New OleDb.OleDbConnection
            OLEDBCon.ConnectionString = _
             "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=" & Form1.TextBox1.Text & ";" & _
             "Persist Security Info=False"
            Command.Connection = OLEDBCon
         
            'データテーブルに敬称区分を保持する列
            Command.CommandText = "select 郵便番号, 住所1, 住所2, 取引先名  , 00 as 印刷枚数 from 取引先T where 取引先コード = @取引先コード "
            Command.Parameters.AddWithValue("@取引先コード", TextBox1.Text)
            Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter
           Adapter.SelectCommand = Command
            Adapter.Fill(dt)
         
           'レコード取得
            TextBox3.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(0))
            TextBox4.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(1))
            TextBox5.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(2))
            TextBox6.Text = CStr(dt.Rows(dt.Rows.Count - 1).Item(3))
        
            '印刷枚数
            Dim d As String = TextBox2.Text
            TextBox7.Text = d

            '敬称
            If RadioButton1.Checked = True Then
                TextBox8.Text = RadioButton1.Text
            ElseIf RadioButton2.Checked = True Then
                TextBox8.Text = RadioButton2.Text
            ElseIf RadioButton3.Checked = True Then
                TextBox8.Text = RadioButton3.Text
            ElseIf RadioButton4.Checked = True Then
                TextBox8.Text = RadioButton4.Text
            End If

            '取引先名
            Dim a As String
            a = TextBox6.Text

            '印刷枚数
            Dim Row As DataRow = dt.Rows(count)
            Row("印刷枚数") = TextBox2.Text
            count = count + 1

            'ラジオボタンの反映
            Dim b As DataColumn = dt.Columns.Item("敬称区分")
          
        If b Is Nothing Then
                dt.Columns.Add("敬称区分", GetType(String))
            End If

            If RadioButton1.Checked = True Then
                Row("敬称区分") = RadioButton1.Text
            ElseIf RadioButton2.Checked = True Then
                Row("敬称区分") = RadioButton2.Text
            ElseIf RadioButton3.Checked = True Then
                Row("敬称区分") = RadioButton3.Text
            End If

            'データテーブルの内容をデータグリッドで確認
            DataGridView1.DataSource = dt

           End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
           ’クリレポ立上げ
            Form4.Show()
            Form4.Activate()
          
    ※クリレポは立ち上がりますが、この先が分かりません

    end sub

    宜しくお願い致します



    2013年1月10日 2:00

回答

  • >> 授頂いたコードで試しましたが、Dim report As CrystalReport1 = Form4.CrystalReportViewer1.ReportSource
    >> →ここで止まり、以下のメッセージが表示されます

    うーん・・・(苦笑)
    まぁ、とりあえず先に修正コードを挙げましょうか。

        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim report As ReportClass = Form4.CrystalReportViewer1.ReportSource
            report.SetDataSource(dt)
            report.Refresh()
    
            Form4.Show()
            Form4.Activate()
        End Sub
    

    あと、下記のネームスペース参照を上記コードと同じドキュメントの先頭に追加して下さい。

    Imports CrystalDecisions.CrystalReports.Engine
    

    >> お手数ですが、アドバイス宜しくお願い致します

    エラーメッセージにあるとおり、原因は型変換エラーです。とももとさんが作っておられるプロジェクトと、私がサンプルを作るために作ったプロジェクトで定義したクラス名が異なるために起きています。
    おそらく提示したコードをそのままコピペして動かなかった、ということだと思いますが、そこらへんは当然読み替えて用いる必要があります。

    さて、ちょっと厳しい事を言いますが・・・
    このレベルの問題をご自分で解決できないということは、まだ変数とか型とかキャストとかの基礎的な概念を理解されていないと思います。このへんはVBとかC#とか関係なしに、プログラミングそのものの基本概念ですので、早い内に理解しておかないと「わからないことがわからない」という状態になりどんどんキツくなっていきます。
    とりあえずVBの入門書なりネットで調べるなりセミナー行くなりして、まず最低限必要な概念を身に着ける事をお勧めします。もちろん、ここで質問することがいけないわけではありませんが、今のままだと折角回答をもらってもそれを活かすことができないでしょう。

    まぁ誰でも最初は初心者です。この業界、根気と向上心が物を言いますので、諦めずに粘り強く頑張ってください。

    • 回答としてマーク とももと 2013年1月14日 5:41
    2013年1月11日 12:31

すべての返信

  • まず、本文の内容が二重になって投稿されているようですので、整理されることをお勧めします。

    さて、本題ですが、クリスタルレポートの帳票はできているのでしょうか? できていなければ、まず作成する必要があります。
    どこまでできていてどの部分でつまずかれているのかわからないのですが、とりあえず参考になりそうなページをご紹介しておきます。

    [C#,VS2010]CrystalReportsで自作DataSetを元に帳票を印刷する。
    http://nanoappli.com/blog/archives/1669


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月10日 4:34
    モデレータ
  • trapemiya様 

    ご回答頂きありがとうございます。本文の内容ですが、訂正しました。大変失礼しました。                            クリスタルレポートの帳票は宛名ラベルウィザードより作成しております。                                     form4を立ち上げると、作成した帳票フォーマットが表示されるのですが、データグリッドビューに表示されていない取引先(mdbファイルに登録されている全ての得意先)がプレビューで表示されてしまいます。                                      印刷枚数と敬称は表示されていませんでした。                                                           印刷枚数というのはラベルを印刷する枚数の事を言います。7枚印刷する場合はそのラベルが7枚あることになります。                                                                                そして敬称とは取引先の敬称です。仮に7枚印刷する場合は、敬称(御中or殿or様)がかっこ内のいずれかに統一されます。                                                                       全ての取引先を表示させるのではなく、データグリッドビューに表示させている取引先をクリスタルレポートに表示致したく思います。                                                                                ご教授頂いたURLから試してみましたが、取引先が表示されず、濃紺、wednesday等 が表示されてしまいます。                                                                                                                        宜しくお願い致します。                



    2013年1月10日 6:56
  • 推測ですが、CrystalReportレイアウトをプロジェクトに追加する際に、宛名ラベルウィザードでデータソースを指定すると思いますが、そこでmdbファイルのテーブルそのものを設定していないでしょうか?
    もしそうであれば、直前のコードの処理に関係無くテーブルの全レコードが表示されます。
    これをButton1_Click内で取得したデータセット(上記コードだとdt)のデータに差し換えたいのであれば、Form4のCrystalReportViewer.ReportSourceに格納されているCrystalReportオブジェクトのSetDataSourceメソッドで、取得済みのdtをセットしてやる必要があります。

        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim report As CrystalReport1 = Form4.CrystalReportViewer1.ReportSource
            report.SetDataSource(dt)
            report.Refresh()
    
            Form4.Show()
            Form4.Activate()
        End Sub
    

    注)あくまで挙がっている情報を元に推測で答えてますので、的外れだったらスミマセン。

    以上、参考になれば幸いです。

    • 回答としてマーク とももと 2013年1月11日 2:40
    • 回答としてマークされていない とももと 2013年1月11日 2:40
    2013年1月10日 8:38
  • ご教授頂いたURLから試してみましたが、取引先が表示されず、濃紺、wednesday等 が表示されてしまいます。                

    クリスタルレポートをデザインする上で、型付データテーブルを事前に作成し、そのデータテーブルを使ってデザインすると楽です。私が紹介したURLでもそのようにしています。
    ともともさんが掲載されたソースにあるdtはどのように生成されていますか?お勧めは、私が紹介したURLに書かれているように、まず型付データテーブルを事前に作成し、それを元にクリスタルレポートを作成し、その型付データテーブルにFillしてデータを入れ、その型付データテーブルをクリスタルレポートに、SetDataSourceメソッドでセットするという流れです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月11日 0:19
    モデレータ
  •  

    みっと様

    ありがとうございます>CrystalReportレイアウトをプロジェクトに追加する際に、
    宛名ラベルウィザードでデータソースを指定すると思いますが、
    そこでmdbファイルのテーブルそのものを設定していないでしょうか?                                            
    おっしゃる通りです。クリスタルレポートのテキストオブジェクトの郵便番号の欄には
    取引先T.郵便番号(文字列) と書いてあります。クリスタルレポートのレイアウトですが
    テーブルそのものを設定した状態であっても、データグリッドビュー内の
    データテーブルを表示させる事は可能でしょうか?

    ご教授頂いたコードで試しましたが、Dim report As CrystalReport1 = Form4.CrystalReportViewer1.ReportSource
    →ここで止まり、以下のメッセージが表示されます

    invalid cast exceptionはハンドルされませんでした
    型 'WindowsApplication1.CrystalReport4' のオブジェクトを
    型 'WindowsApplication1.CrystalReport1' にキャストできません。

    お手数ですが、アドバイス宜しくお願い致します

    2013年1月11日 10:05
  • trapemiya様

    回答ありがとうございます。可能でしたらコードを直接ご教授いただけないでしょうか?

    dtですが、フォーム5のデータグリッドビューより検索を行いヒットした取引先を選択します。    選択後フォーム3に戻り取引先コードを表示させます。取引先コードをキーにして、データテーブルを作成し、データグリッドビューに表示させています。出来れば、質問いたしましたコードにて行いたく思いますが。いかがでしょうか?

    2013年1月11日 10:13
  • >> 授頂いたコードで試しましたが、Dim report As CrystalReport1 = Form4.CrystalReportViewer1.ReportSource
    >> →ここで止まり、以下のメッセージが表示されます

    うーん・・・(苦笑)
    まぁ、とりあえず先に修正コードを挙げましょうか。

        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim report As ReportClass = Form4.CrystalReportViewer1.ReportSource
            report.SetDataSource(dt)
            report.Refresh()
    
            Form4.Show()
            Form4.Activate()
        End Sub
    

    あと、下記のネームスペース参照を上記コードと同じドキュメントの先頭に追加して下さい。

    Imports CrystalDecisions.CrystalReports.Engine
    

    >> お手数ですが、アドバイス宜しくお願い致します

    エラーメッセージにあるとおり、原因は型変換エラーです。とももとさんが作っておられるプロジェクトと、私がサンプルを作るために作ったプロジェクトで定義したクラス名が異なるために起きています。
    おそらく提示したコードをそのままコピペして動かなかった、ということだと思いますが、そこらへんは当然読み替えて用いる必要があります。

    さて、ちょっと厳しい事を言いますが・・・
    このレベルの問題をご自分で解決できないということは、まだ変数とか型とかキャストとかの基礎的な概念を理解されていないと思います。このへんはVBとかC#とか関係なしに、プログラミングそのものの基本概念ですので、早い内に理解しておかないと「わからないことがわからない」という状態になりどんどんキツくなっていきます。
    とりあえずVBの入門書なりネットで調べるなりセミナー行くなりして、まず最低限必要な概念を身に着ける事をお勧めします。もちろん、ここで質問することがいけないわけではありませんが、今のままだと折角回答をもらってもそれを活かすことができないでしょう。

    まぁ誰でも最初は初心者です。この業界、根気と向上心が物を言いますので、諦めずに粘り強く頑張ってください。

    • 回答としてマーク とももと 2013年1月14日 5:41
    2013年1月11日 12:31
  • みっと様

    厳しいアドバイスに感謝します ありがとうございました

    2013年1月14日 5:41