次の方法で共有


チュートリアル:ファイル ディレクトリからのレポートのドロップダウン リストの値の設定

概要

一般的には、Web アプリケーションから埋め込みでないレポートへのパスをハード コードします。ハード コードされたファイル パスは操作が簡単ですが、保守のための時間は増大します。ファイル パスをハード コードすると、アプリケーションにレポートを追加したり既存のレポートを変更したりするたびに、プロジェクトの再ビルドが必要になります。

このチュートリアルでは、ローカル ファイル システムからレポートのリストを DropDownList コントロールに設定する方法を学習します。これによって、プロジェクトを再ビルドしなくても、レポートを追加または変更できるようになります。

また、Crystal Reports Web サービスを使用して、リモート サーバーからレポートのリストを設定することもできます。詳細については、「チュートリアル:Web サービスからのレポートのドロップダウン リストの値の設定」を参照してください。

サンプル コード

このチュートリアルは、プロジェクトの完全バージョンを示す Visual Basic および C# のサンプル コードと共に提供されます。このチュートリアルの手順に従って新しいプロジェクトを作成するか、またはサンプル コード プロジェクトを開いて完全バージョンを使用します。

サンプル コードは言語とプロジェクト タイプに分類され、フォルダに格納されています。各サンプル コード バージョンのフォルダ名は次のとおりです。

  • C# Web サイト:CS_Web_DrpFileDir
  • Visual Basic Web サイト: VB_Web_DrpFileDir

これらのサンプルが格納されたフォルダを探すには、「チュートリアルのサンプル コード」を参照してください。

Reports フォルダを作成する

ここでは、サブディレクトリに含まれている、埋め込みでないレポートのリストを DropDownList コントロールに設定するコードを記述します。

  1. ソリューション エクスプローラで太字のプロジェクト名を右クリックし、[フォルダの追加]をポイントして[標準フォルダ]をクリックします。

  2. このフォルダの名前を「Reports」にします。

  3. ソリューション エクスプローラで[Reports]フォルダを右クリックし、[既存項目の追加]をクリックします。

  4. [既存項目の追加]ダイアログ ボックスで、[ファイルの種類]にすべてのファイル(*.*)を指定します。

  5. Crystal reports のサンプル レポート ディレクトリの feature examples フォルダにある Hierarchical Grouping.rpt ファイルに移動します

サンプル レポートの場所については、[「サンプル レポートのディレクトリ」](ms225622\(v=vs.90\).md)を参照してください。

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/w5dk7atd.alert_note(ja-jp,VS.90).gif" title="Note" alt="Note" class="note" />注</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Hierarchical Grouping レポートは、Access データベースの xtreme.mdb からデータを取得します。このデータベースの場所とその ODBC DSN 設定を確認していない場合には、<a href="ms225528(v=vs.90).md">「確認必要事項」</a>を参照してください。</p></td>
</tr>
</tbody>
</table>
  1. Hierarchical Grouping.Rpt ファイルをクリックして選択し、次に[開く]をクリックします。

    Hierarchical Grouping.rpt ファイルがプロジェクトに追加されます。

  2. 次の手順に進む前に、Sample Reports ディレクトリからさらに 2 つのレポートを追加します。

ここでは、Reports サブディレクトリ内の並べ替えられたレポートのリストを設定します。

  1. Web フォームを開きます。

  2. [表示]メニューの[コード]をクリックします。

  3. System.IO 名前空間と System.Collections 名前空間のために、"Imports" または "using" 宣言をクラスの先頭(クラス署名の上)に追加します。

    Imports System.IO
    Imports System.Collections
    
    using System.IO;
    using System.Collections;
    
  4. クラス レベルで、新しい ReportDocument 変数の reportDocument を作成します。

``` vb
Private myReportDocument As ReportDocument
```

``` csharp
private ReportDocument reportDocument;
```
  1. page_init() メソッド内で、Not IsPostBack 条件ブロックを作成します。

    Note

    Not IsPostBack 条件ブロックは、ページが初めてロードされるときにのみ実行するコードのカプセル化に使用されます。通常、コントロールは Not IsPostBack 条件ブロック内でデータ値にバインドされるため、ページの再ロード中にはこれらのデータ値(および後続のあらゆるコントロール イベント)はリセットされません。

    If Not IsPostBack Then
    Else
    End If
    
    if(!IsPostBack)
    {
    }
    else
    {
    }
    
  2. Not IsPostBack 条件ブロックの内部で、レポート フォルダへのパスを保持する文字列変数を作成します。

    Note

    この前の手順をスキップしていて、既存のレポートのディレクトリがある場合は、Reports/ の代わりにそのディレクトリへのファイル パスを入力してください。

    Dim myReportPath As String = Server.MapPath("Reports/")
    
    string reportPath = Server.MapPath("Reports/");
    
  3. Directory.GetFiles() メソッドを使用して、Reports フォルダの内容を取得します。その結果を reports 配列に割り当てます。

    Dim reports() As String = Directory.GetFiles(myReportPath, "*.rpt")
    
    string[] reports = Directory.GetFiles(reportPath, "*.rpt");
    
  4. 次の行で、SortedList クラスをインスタンス化して、それをその親インターフェイスの IDictionary に渡します。

    Dim mySortedList As IDictionary = New SortedList
    
    IDictionary sortedList = new SortedList();
    
  5. 次に、reports の各要素によってループする For Each ループを作成し、各レポートの名前からファイル パスを削除します。

    For Each path As String In reports
    Dim reportNamePrefix As Integer = path.LastIndexOf("\") + 1
    Dim reportNameLength As Integer = path.Length - reportNamePrefix
    Dim reportName As String = path.Substring(reportNamePrefix,reportNameLength)
    mySortedList.Add(path, reportName)
    Next
    
    foreach (string path in reports)
    {
    int reportNamePrefix = path.LastIndexOf(@"\") + 1;
    int reportNameLength = path.Length - reportNamePrefix;
    string reportName = path.Substring(reportNamePrefix, reportNameLength);
    sortedList.Add(path, reportName);
    }
    

並べ替えられたリストを DropDownList コントロールにバインドする

ここでは、IDictionary データ ソースを DropDownList コントロールにバインドする方法を学習します。最初に、IDictionary コレクションのエレメントと DropDownList フィールドの関係を定義します。次に、IDictionary データ ソースを DropDownList コントロールにバインドします。

  1. foreach ループの外部で、DropDownList の Value フィールドを sortedList インスタンス の key プロパティに割り当てるコードを追加します。

    reportsList.DataTextField = "value"
    
    reportsList.DataTextField = "value";
    
  2. 次に、DropDownList コントロールの Value フィールドを sortedList インスタンス の key プロパティに割り当てます。

``` vb
reportsList.DataValueField = "key"
```

``` csharp
reportsList.DataValueField = "key";
```
  1. SortedList インスタンスを DropDownList コントロールの dataSource プロパティに割り当てます。

    reportsList.DataSource = mysortedList
    
    reportsList.DataSource = sortedList;
    
  2. 最後に、データ ソースを DropDownList にバインドします。

    reportsList.DataBind()
    
    reportsList.DataBind();
    

    これで、If Not IsPostBack 条件ブロックの内容作成が終了しました。次のセクションでは、Else 条件ブロック内部で、ReportDocument インスタンスに新しい値を割り当てずにページが最新表示されたときの動作を定義するコードを記述します。

  3. else 文の内部で、現在のセッションで保留されているレポートにレポート ドキュメントのインスタンスを割り当てます。

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/w5dk7atd.alert_note(ja-jp,VS.90).gif" title="Note" alt="Note" class="note" />注</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Session は一般的なオブジェクトだけを返すため、レポートを目的のレポート タイプにキャストする必要があります。埋め込みレポートと埋め込みでないレポートのどちらを使用している場合でも、取得したオブジェクトを ReportDocument タイプにキャストします。</p></td>
</tr>
</tbody>
</table>

``` vb
myReportDocument = CType(Session("myReportDocument"),
ReportDocument)
```

``` csharp
reportDocument = (ReportDocument)Session["reportDocument"];
```
  1. 次の行では、ReportDocument インスタンスを CrystalReportViewer コントロールにバインドします。

    myCrystalReportViewer.ReportSource = myReportDocument
    
    crystalReportViewer.ReportSource = reportDocument;
    
  2. [ファイル]メニューの[すべて保存]をクリックします。

  3. [ビルド]メニューで[ソリューションのビルド]を選択します。

  4. ビルド エラーが発生した場合は、ここで修正します。

この節の内容