none
Report作成でエラー【これらの引数に最も固有な、アクセス可能な 'New' がないため、】 RRS feed

  • 質問

  • いつもお世話になっております。

    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 タイトルをわかりやすく訂正
    2013年9月26日 4:16

回答

  • 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
    2013年9月26日 10:38
  • 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
    2013年9月26日 5:09
    モデレータ

すべての返信

  • 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
    2013年9月26日 5:09
    モデレータ
  • 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
    2013年9月26日 10:38
  • Trapemiya さま

    いつも大変にお世話になっております。
    おっしゃるとおりエラーの出ている箇所は、

    e.DataSources.Add(
      New Microsoft.Reporting.WinForms.ReportDataSource(
      "MyDataSet_注文詳細", 注文詳細TableAdapter.GetDataBy(
      strValue)))

    の箇所です。

    System.Data.DataTable を指定しましたら
    エラーが消えました。大変にたすかりました。
    どうもありがとうございました。

    2013年10月1日 3:41
  • gekka さま

    ありがとうございます。
    gekka さまにご提示いただいた記述を追記しましたところ
    そのどれもでエラーがなくなりました。

    アドバイスいただいた内容をもう一度よく勉強し、
    理解したいと思います。

    本当にどうもありがとうございました。

    2013年10月1日 3:43