- PR -

レポートでFORMのコントロールの値を取得したい

投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-03-23 10:09
<環境>
Microsoft Visual Studio 2008
SQL Server 2005
ActiveReports for .NET 3.0J

いつもお世話になります。
レポート開くときに、FORM1のコントロールの値を取得したいのですが、取得できません。
どうすれば取得できるのでしょうか?
よろしくお願いします。

<やりたい処理>
@FORM1には次のコントロールがあります。
 textbox1、印刷ボタン
AFORM1の印刷ボタン押下でレポートを印刷する。
 この時、ReportStartでSqlCommandを生成して実行し、DataReaderを取得しているので、
 textbox1の値を条件に設定したい
 下記のコードだと、f.textbox1.Text=""を取得してしまいます。
コード:
Public Class FORM1
    Private Sub 印刷ボタン_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
            Dim f As New FORM1
            Dim rpt As DataDynamics.ActiveReports.ActiveReport3
            rpt = New rpt0000
            rpt.Run()
    End Sub
End Class

Public Class rpt0000
    Private Sub rpt0000_ReportStart(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart
            Dim f As New FORM1
            conn = New SqlConnection(My.Settings.MyAppConnect)
            conn.Open()
            strsql = "SELECT CD, MEI, KANA FROM Table WHERE (CD = '" & f.textbox1.Text & "') "
            Dim cmd As New SqlCommand(strsql, conn)
            dataReader = cmd.ExecuteReader()
    End Sub
End Class


セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-03-23 10:50
動かない原因は「 Dim f As New FORM1 」
新たにインスタンス化したオブジェクトとボタンが押されたFORM1は別のオブジェクトです。
コンストラクタとインスタンスについてしらべてみてください。

っという事で、rpt0000のコンストラクタに渡してしまってはどうでしょうか?
ソースはたぶんうごくと思います・・・

引用:

chiroruさんの書き込み (2009-03-23 10:09) より:
コード:

Public Class FORM1
Private Sub 印刷ボタン_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
Dim f As New FORM1 '不要
Dim rpt As DataDynamics.ActiveReports.ActiveReport3
rpt = New rpt0000(Me)
rpt.Run()
End Sub
End Class

Public Class rpt0000
'***追加ここから***
Private _owner As FORM1= Nothing

Public Sub New(ByVal owner As FORM1)
Me._owner = owner
End Sub
'***追加ここまで***

Private Sub rpt0000_ReportStart(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart
Dim f As FORM1 = Me._owner '変更
conn = New SqlConnection(My.Settings.MyAppConnect)
conn.Open()
strsql = "SELECT CD, MEI, KANA FROM Table WHERE (CD = '" & f.textbox1.Text & "') "
Dim cmd As New SqlCommand(strsql, conn)
dataReader = cmd.ExecuteReader()
End Sub
End Class






[ メッセージ編集済み 編集者: セラフ 編集日時 2009-03-23 10:56 ]
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-03-23 11:32
早速試してみました。
一部エラーとなったので下記のように変更しました。
rpt = New rpt0000 →(変更)rpt = New rpt0000(Me)
これで動いたのですが、Public Sub NewのNewのところで警告が発生します。
警告:デザイナで生成された型 'プロジェクト名.rpt0000' の 'Public Sub New(owner As FORM1)' は
   InitializeComponent メソッドを呼び出さなければなりません。
この警告はどうすれば消えるでしょうか?
また、今まで動いていたところなのですが、このように変更してから単純にレポートのラベルに設定するところでエラーとなってしまいました。
これについてもよろしければ教えて下さい。

コード:
Public Class rpt0000
    Private _owner As FORM1= Nothing
    Public Sub New(ByVal owner As FORM1)
            Me._owner = owner
    End Sub
    Private Sub rpt0000_ReportStart(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart
            Dim f As FORM1 = Me._owner  
            conn = New SqlConnection(My.Settings.MyAppConnect)
            conn.Open()
            strsql = "SELECT CD, MEI, KANA FROM Table WHERE (CD = '" & f.textbox1.Text & "') "
            Dim cmd As New SqlCommand(strsql, conn)
            dataReader = cmd.ExecuteReader()
            me.lbltitle.Text = "テスト一覧表"	←ここでエラー(オブジェクト参照がオブジェクト インスタンスに設定されていません。)
    End Sub
End Class


かずい
常連さん
会議室デビュー日: 2008/09/30
投稿数: 28
お住まい・勤務地: 北海道札幌市
投稿日時: 2009-03-23 11:48
元々定義されていたNewメソッドを書き換えてしまっていますか?

セラフさんが提示されている内容は、Newメソッドのオーバーロードを作るか
Newメソッドをオーバーライドして作成しないとだめだと思います。
あとは、レポート作成時に自動生成されるNewメソッドにある内容は削除してはいけません。
(レポートの生成が正常に行われなくなります。)

ラベル設定でエラーになっているのは、警告メッセージにあるInitializeComponentが
コールされていないため、帳票の項目定義が実行されていないためにエラーとなります。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-03-23 12:00
引用:

chiroruさんの書き込み (2009-03-23 11:32) より:
これで動いたのですが、Public Sub NewのNewのところで警告が発生します。
警告:デザイナで生成された型 'プロジェクト名.rpt0000' の 'Public Sub New(owner As FORM1)' は
   InitializeComponent メソッドを呼び出さなければなりません。

ActiveReportsはよくわかりませんが、
rpt0000はControlを継承したクラスのようですので、
エラーメッセージの通りInitializeComponentの呼び出しが必要の様子ですね。
このへんは調べればわかるものだと思いますのでググレって言いたいところですが、一応回答しておきます。ソース見てみてください。

InitializeComponentって何?っていうのは、
rpt0000.Designer.vbとかそれに近いような名前のファイルが勝手に作成されてると思いますので、見てみてください。
コントロールのインスタンス化やデザインの設定etcなんかをやってくれてるはずです。
従ってこれを呼ばないと、設置したコントロールなどがインスタンス化されないため、エラーとなってしまいます。

コード:
Public Class rpt0000
    Private _owner As FORM1= Nothing
    Public Sub New(ByVal owner As FORM1)
            Me.InitializeComponent() 'エラーメッセージどおり追加するだけ
            Me._owner = owner
    End Sub
    Private Sub rpt0000_ReportStart(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart
            Dim f As FORM1 = Me._owner  
            conn = New SqlConnection(My.Settings.MyAppConnect)
            conn.Open()
            strsql = "SELECT CD, MEI, KANA FROM Table WHERE (CD = '" & f.textbox1.Text & "') "
            Dim cmd As New SqlCommand(strsql, conn)
            dataReader = cmd.ExecuteReader()
            me.lbltitle.Text = "テスト一覧表"	←ここでエラー(オブジェクト参照がオブジェクト インスタンスに設定されていません。)
    End Sub
End Class


chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-03-23 13:35
Me.InitializeComponent()を追加することでできました。
ただ、Newした時にはInitializeComponentを呼び出すコーディングをしなくてはいけなく、Newしない場合は呼び出す必要がないのはまだ???の状態です。
もう少し勉強が必要のようです。
ありがとうございます。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-03-23 14:00
引用:

chiroruさんの書き込み (2009-03-23 13:35) より:
ただ、Newした時にはInitializeComponentを呼び出すコーディングをしなくてはいけなく、Newしない場合は呼び出す必要がないのはまだ???の状態です。


ヒントは継承です。VBがいろいろ勝手にやってくれているから意識しなくともプログラムはかけますが、裏で何をやっているか知っておくと、より理解が深まると思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-23 15:46
この疑問に関して "継承" は直接関係あるのでしょうか? "VB がいろいろ勝手にやってくれているから" の部分はデフォルト コンストラクタのこと (InitializeComponent メソッド) も含まれますから "New しない場合" の解釈によっては間違いではないと思いますけども。

ただ (個人的に違和感のある表現である) "New した場合" と "New しない場合" というのが、コンストラクタ自体を示しているのか、あるいは構文上の "New 型()" の部分を示しているのかわかりませんが (普通は前者を示すことが多いのですが)、これ自体も流れを見る限りなんだか混同しているような気がするのですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)