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

質問
-
現在ラベル印刷プログラムを作成しております
開発業務を始めて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 IfIf 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 = dtEnd 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日 4:51
回答
-
>> 授頂いたコードで試しましたが、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
すべての返信
-
まず、本文の内容が二重になって投稿されているようですので、整理されることをお勧めします。
さて、本題ですが、クリスタルレポートの帳票はできているのでしょうか? できていなければ、まず作成する必要があります。
どこまでできていてどの部分でつまずかれているのかわからないのですが、とりあえず参考になりそうなページをご紹介しておきます。[C#,VS2010]CrystalReportsで自作DataSetを元に帳票を印刷する。
http://nanoappli.com/blog/archives/1669★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
trapemiya様
ご回答頂きありがとうございます。本文の内容ですが、訂正しました。大変失礼しました。 クリスタルレポートの帳票は宛名ラベルウィザードより作成しております。 form4を立ち上げると、作成した帳票フォーマットが表示されるのですが、データグリッドビューに表示されていない取引先(mdbファイルに登録されている全ての得意先)がプレビューで表示されてしまいます。 印刷枚数と敬称は表示されていませんでした。 印刷枚数というのはラベルを印刷する枚数の事を言います。7枚印刷する場合はそのラベルが7枚あることになります。 そして敬称とは取引先の敬称です。仮に7枚印刷する場合は、敬称(御中or殿or様)がかっこ内のいずれかに統一されます。 全ての取引先を表示させるのではなく、データグリッドビューに表示させている取引先をクリスタルレポートに表示致したく思います。 ご教授頂いたURLから試してみましたが、取引先が表示されず、濃紺、wednesday等 が表示されてしまいます。 宜しくお願い致します。
- 編集済み とももと 2013年1月10日 7:26
-
推測ですが、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
注)あくまで挙がっている情報を元に推測で答えてますので、的外れだったらスミマセン。
以上、参考になれば幸いです。
-
ご教授頂いたURLから試してみましたが、取引先が表示されず、濃紺、wednesday等 が表示されてしまいます。
クリスタルレポートをデザインする上で、型付データテーブルを事前に作成し、そのデータテーブルを使ってデザインすると楽です。私が紹介したURLでもそのようにしています。
ともともさんが掲載されたソースにあるdtはどのように生成されていますか?お勧めは、私が紹介したURLに書かれているように、まず型付データテーブルを事前に作成し、それを元にクリスタルレポートを作成し、その型付データテーブルにFillしてデータを入れ、その型付データテーブルをクリスタルレポートに、SetDataSourceメソッドでセットするという流れです。★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
みっと様
ありがとうございます>CrystalReportレイアウトをプロジェクトに追加する際に、
宛名ラベルウィザードでデータソースを指定すると思いますが、
そこでmdbファイルのテーブルそのものを設定していないでしょうか?
おっしゃる通りです。クリスタルレポートのテキストオブジェクトの郵便番号の欄には
取引先T.郵便番号(文字列) と書いてあります。クリスタルレポートのレイアウトですが
テーブルそのものを設定した状態であっても、データグリッドビュー内の
データテーブルを表示させる事は可能でしょうか?ご教授頂いたコードで試しましたが、Dim report As CrystalReport1 = Form4.CrystalReportViewer1.ReportSource
→ここで止まり、以下のメッセージが表示されますinvalid cast exceptionはハンドルされませんでした
型 'WindowsApplication1.CrystalReport4' のオブジェクトを
型 'WindowsApplication1.CrystalReport1' にキャストできません。お手数ですが、アドバイス宜しくお願い致します
-
>> 授頂いたコードで試しましたが、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