トップ回答者
Report作成でエラー【これらの引数に最も固有な、アクセス可能な 'New' がないため、】

質問
-
いつもお世話になっております。
Visual Basic 2010 Pro(WinXP SP3)において、
秀和システム Visual Basic で学ぶ
ADO.NET 3.5 データベース プログラミング
木暮 啓一 氏 著書 において、P324
6.2.6 明細部分のデータソースを設定するコードに追加
の、[2]のプログラムにエラーが出てしまい、いろいろと解決策を探してみたのですが、私のレベルでは
解決に至りませんでした。ご教示いただけませんでしょうか内容は、明細行付の受注書を作成すると言うものです。
手順として、フォーム(Form1)に、
ReportViewer(ReportViewer1)を貼り付け、ReportViewer1 の[レポートの選択]に、
Report1 を指定。Report1 の中に、サブレポート(subreport1)を
貼り付け、subreport1 の[ReportName]に、
Report2 を指定いたしました。Form1 のコードに、
Public Class Form1 Private Sub Form1_Load( sender As System.Object, e As System.EventArgs) Handles MyBase.Load '表示モードを印刷レイアウトに設定します。 ReportViewer1.SetDisplayMode( Microsoft.Reporting.WinForms.DisplayMode.PrintLayout) 注文マスターTableAdapter.Fill(MyDataSet.注文マスター) 'レポートを表示します。 ReportViewer1.RefreshReport() End Sub Private Sub SubreportProcessingEventHandler( ByVal sender As System.Object, ByVal e As Microsoft.Reporting.WinForms.SubreportProcessingEventArgs) 'パラメータから渡された受注コードを取得します。 Dim strValue As String = e.Parameters("受注コード").Values(0) 'テーブルアダプタ(注文詳細TableAdapter)のGetDataByメソッドによって返された、 'データテーブルをデータソースとしてサブレポートに追加します。 e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", 注文詳細TableAdapter.GetDataBy(strValue))) End Sub End Class
と書いたところ、
次のようなエラーが出てしまいます。
これらの引数に最も固有な、アクセス可能な 'New' がないため、
オーバーロードの解決に失敗しました:
'Public Sub New(
name As String, dataSourceValue As System.Collections.IEnumerable)':
最も固有ではありません。'Public Sub New(
name As String, dataSourceValue As System.Data.DataTable)':
最も固有ではありません。木暮氏のホームページには書籍の記載内容への質問は受け付けませんと
あります。どうかお力をお貸しいただけませんでしょうか。よろしくお願い申し上げます。
- 編集済み kei_chan_gt 2013年9月26日 4:17 タイトルをわかりやすく訂正
回答
-
ReportDataSourceには引数を2個持つのコンストラクタが複数あります。
そのため、System.Data.TypedTableBase(of T)から派生している型を第2引数として渡すと、System.Collections.IEnumerableとSystem.Data.DataTableのどちらの引数のコンストラクタを使うかの判断に失敗するようです。
#この動作はVB.NetでもC#でも発生します。例えば以下のようなオーバーロードされたメソッドにSystem.Data.TypedTableBase(of T)から派生したクラスを渡すと同じエラーが出ます。
Public Overloads Sub Test(ByVal ie As System.Collections.IEnumerable) End Sub Public Overloads Sub Test(ByVal dt As System.Data.DataTable) End Sub
ゆえに以下のように、IEnumerableかTableのどちらのメソッドを呼び出すか明示することで回避してやる必要があります。
'DataTable型にしてから渡す Dim table As System.Data.DataTable = 注文詳細TableAdapter.GetDataBy(strValue) e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", table)) 'DataTable型にキャストして渡す e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", DirectCast(注文詳細TableAdapter.GetDataBy(strValue), DataTable))) 'テーブルのRowsをIEnumerableとして渡す e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", 注文詳細TableAdapter.GetDataBy(strValue).Rows))
9/2712:40 追記
もう少し正確に書くと、DataTableを継承したクラスがIEnumerableインターフェースも実装していると発生します。
TypedTableBase(of T)はこの条件を満たしているためエラーになります。
引数がクラスとインターフェースの違いしかないメソッドでは同様に失敗します。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2013年9月27日 3:42 追記
- 回答の候補に設定 星 睦美 2013年9月30日 5:39
- 回答としてマーク kei_chan_gt 2013年10月1日 3:45
-
Sub Newというのはコンストラクタであり、それをどこかで実行しており、実行する際の引数の数、もしくは引数の型が誤っているために発生しているエラーのように思います。
掲載されたコードでNewしているのは、ReportDataSourceの部分ですが、もしここでエラーが発生しているのでしたら、注文詳細TableAdapter.GetDataBy(strValue)の戻り値の型を確認してみて下さい。もし、System.Collections.IEnumerable型でもSystem.Data.DataTableでない場合は、どちらかの型を返すように変更してみて下さい。
また、注文詳細TableAdapter.GetDataBy(strValue)が適切な値を返しているか確認してみて下さい。★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 星 睦美 2013年9月30日 5:38
- 回答としてマーク kei_chan_gt 2013年10月1日 3:42
- 回答としてマークされていない kei_chan_gt 2013年10月1日 3:46
- 回答としてマーク kei_chan_gt 2013年10月1日 3:46
すべての返信
-
Sub Newというのはコンストラクタであり、それをどこかで実行しており、実行する際の引数の数、もしくは引数の型が誤っているために発生しているエラーのように思います。
掲載されたコードでNewしているのは、ReportDataSourceの部分ですが、もしここでエラーが発生しているのでしたら、注文詳細TableAdapter.GetDataBy(strValue)の戻り値の型を確認してみて下さい。もし、System.Collections.IEnumerable型でもSystem.Data.DataTableでない場合は、どちらかの型を返すように変更してみて下さい。
また、注文詳細TableAdapter.GetDataBy(strValue)が適切な値を返しているか確認してみて下さい。★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 星 睦美 2013年9月30日 5:38
- 回答としてマーク kei_chan_gt 2013年10月1日 3:42
- 回答としてマークされていない kei_chan_gt 2013年10月1日 3:46
- 回答としてマーク kei_chan_gt 2013年10月1日 3:46
-
ReportDataSourceには引数を2個持つのコンストラクタが複数あります。
そのため、System.Data.TypedTableBase(of T)から派生している型を第2引数として渡すと、System.Collections.IEnumerableとSystem.Data.DataTableのどちらの引数のコンストラクタを使うかの判断に失敗するようです。
#この動作はVB.NetでもC#でも発生します。例えば以下のようなオーバーロードされたメソッドにSystem.Data.TypedTableBase(of T)から派生したクラスを渡すと同じエラーが出ます。
Public Overloads Sub Test(ByVal ie As System.Collections.IEnumerable) End Sub Public Overloads Sub Test(ByVal dt As System.Data.DataTable) End Sub
ゆえに以下のように、IEnumerableかTableのどちらのメソッドを呼び出すか明示することで回避してやる必要があります。
'DataTable型にしてから渡す Dim table As System.Data.DataTable = 注文詳細TableAdapter.GetDataBy(strValue) e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", table)) 'DataTable型にキャストして渡す e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", DirectCast(注文詳細TableAdapter.GetDataBy(strValue), DataTable))) 'テーブルのRowsをIEnumerableとして渡す e.DataSources.Add( New Microsoft.Reporting.WinForms.ReportDataSource( "MyDataSet_注文詳細", 注文詳細TableAdapter.GetDataBy(strValue).Rows))
9/2712:40 追記
もう少し正確に書くと、DataTableを継承したクラスがIEnumerableインターフェースも実装していると発生します。
TypedTableBase(of T)はこの条件を満たしているためエラーになります。
引数がクラスとインターフェースの違いしかないメソッドでは同様に失敗します。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2013年9月27日 3:42 追記
- 回答の候補に設定 星 睦美 2013年9月30日 5:39
- 回答としてマーク kei_chan_gt 2013年10月1日 3:45