チュートリアル:ファイル ディレクトリからのレポートのドロップダウン リストの値の設定
概要
一般的には、Web アプリケーションから埋め込みでないレポートへのパスをハード コードします。ハード コードされたファイル パスは操作が簡単ですが、保守のための時間は増大します。ファイル パスをハード コードすると、アプリケーションにレポートを追加したり既存のレポートを変更したりするたびに、プロジェクトの再ビルドが必要になります。
このチュートリアルでは、ローカル ファイル システムからレポートのリストを DropDownList コントロールに設定する方法を学習します。これによって、プロジェクトを再ビルドしなくても、レポートを追加または変更できるようになります。
また、Crystal Reports Web サービスを使用して、リモート サーバーからレポートのリストを設定することもできます。詳細については、「チュートリアル:Web サービスからのレポートのドロップダウン リストの値の設定」を参照してください。
サンプル コード
このチュートリアルは、プロジェクトの完全バージョンを示す Visual Basic および C# のサンプル コードと共に提供されます。このチュートリアルの手順に従って新しいプロジェクトを作成するか、またはサンプル コード プロジェクトを開いて完全バージョンを使用します。
サンプル コードは言語とプロジェクト タイプに分類され、フォルダに格納されています。各サンプル コード バージョンのフォルダ名は次のとおりです。
- C# Web サイト:CS_Web_DrpFileDir
- Visual Basic Web サイト: VB_Web_DrpFileDir
これらのサンプルが格納されたフォルダを探すには、「チュートリアルのサンプル コード」を参照してください。
Reports フォルダを作成する
ここでは、サブディレクトリに含まれている、埋め込みでないレポートのリストを DropDownList コントロールに設定するコードを記述します。
ソリューション エクスプローラで太字のプロジェクト名を右クリックし、[フォルダの追加]をポイントして[標準フォルダ]をクリックします。
このフォルダの名前を「Reports」にします。
ソリューション エクスプローラで[Reports]フォルダを右クリックし、[既存項目の追加]をクリックします。
[既存項目の追加]ダイアログ ボックスで、[ファイルの種類]にすべてのファイル(*.*)を指定します。
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>
Hierarchical Grouping.Rpt ファイルをクリックして選択し、次に[開く]をクリックします。
Hierarchical Grouping.rpt ファイルがプロジェクトに追加されます。
次の手順に進む前に、Sample Reports ディレクトリからさらに 2 つのレポートを追加します。
DropDownList コントロールに値を設定する
ここでは、Reports サブディレクトリ内の並べ替えられたレポートのリストを設定します。
Web フォームを開きます。
[表示]メニューの[コード]をクリックします。
System.IO 名前空間と System.Collections 名前空間のために、"Imports" または "using" 宣言をクラスの先頭(クラス署名の上)に追加します。
Imports System.IO Imports System.Collections
using System.IO; using System.Collections;
クラス レベルで、新しい ReportDocument 変数の reportDocument を作成します。
``` vb
Private myReportDocument As ReportDocument
```
``` csharp
private ReportDocument reportDocument;
```
page_init() メソッド内で、Not IsPostBack 条件ブロックを作成します。
注 Not IsPostBack 条件ブロックは、ページが初めてロードされるときにのみ実行するコードのカプセル化に使用されます。通常、コントロールは Not IsPostBack 条件ブロック内でデータ値にバインドされるため、ページの再ロード中にはこれらのデータ値(および後続のあらゆるコントロール イベント)はリセットされません。
If Not IsPostBack Then Else End If
if(!IsPostBack) { } else { }
Not IsPostBack 条件ブロックの内部で、レポート フォルダへのパスを保持する文字列変数を作成します。
注 この前の手順をスキップしていて、既存のレポートのディレクトリがある場合は、Reports/ の代わりにそのディレクトリへのファイル パスを入力してください。
Dim myReportPath As String = Server.MapPath("Reports/")
string reportPath = Server.MapPath("Reports/");
Directory.GetFiles() メソッドを使用して、Reports フォルダの内容を取得します。その結果を reports 配列に割り当てます。
Dim reports() As String = Directory.GetFiles(myReportPath, "*.rpt")
string[] reports = Directory.GetFiles(reportPath, "*.rpt");
次の行で、SortedList クラスをインスタンス化して、それをその親インターフェイスの IDictionary に渡します。
Dim mySortedList As IDictionary = New SortedList
IDictionary sortedList = new SortedList();
次に、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 コントロールにバインドします。
foreach ループの外部で、DropDownList の Value フィールドを sortedList インスタンス の key プロパティに割り当てるコードを追加します。
reportsList.DataTextField = "value"
reportsList.DataTextField = "value";
次に、DropDownList コントロールの Value フィールドを sortedList インスタンス の key プロパティに割り当てます。
``` vb
reportsList.DataValueField = "key"
```
``` csharp
reportsList.DataValueField = "key";
```
SortedList インスタンスを DropDownList コントロールの dataSource プロパティに割り当てます。
reportsList.DataSource = mysortedList
reportsList.DataSource = sortedList;
最後に、データ ソースを DropDownList にバインドします。
reportsList.DataBind()
reportsList.DataBind();
これで、If Not IsPostBack 条件ブロックの内容作成が終了しました。次のセクションでは、Else 条件ブロック内部で、ReportDocument インスタンスに新しい値を割り当てずにページが最新表示されたときの動作を定義するコードを記述します。
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"];
```
次の行では、ReportDocument インスタンスを CrystalReportViewer コントロールにバインドします。
myCrystalReportViewer.ReportSource = myReportDocument
crystalReportViewer.ReportSource = reportDocument;
[ファイル]メニューの[すべて保存]をクリックします。
[ビルド]メニューで[ソリューションのビルド]を選択します。
ビルド エラーが発生した場合は、ここで修正します。