Web サイトの DropDownList コントロールの値の設定
ここでは、埋め込みでないレポートのリストを DropDownList コントロールに設定するコードを記述します。getReports() ヘルパー メソッドを使用して、Crystal Reports Web サービスからレポートのリストを生成し、次にそのリストを DropDownList コントロールにバインドします。
Windows プロジェクトの場合は、「Windows プロジェクトの ComboBox コントロールの値の設定」を参照してください。
Web サイトで DropDownList コントロールに値を入力する
Web フォームを開きます。
[表示]メニューの[コード]をクリックします。
System.IO 名前空間と System.Collections 名前空間のために、"Imports"[Visual Basic] または "using"[C#] 宣言をクラスの先頭(クラス署名の上)に追加します。
``` vb
Imports System.IO
Imports System.Collections
```
``` csharp
using System.IO;
using System.Collections;
```
page_load() イベント ハンドラの内部に、Not IsPostBack 条件ブロックを作成します。
注 Not IsPostBack 条件ブロックは、ページが初めてロードされるときにのみ実行するコードのカプセル化に使用されます。通常、コントロールは Not IsPostBack 条件ブロック内でデータ値にバインドされるため、ページの再ロード中にはこれらのデータ値(および後続のあらゆるコントロール イベント)はリセットされません。
If Not IsPostBack Then Else End If
if(!IsPostBack) { } else { }
If ブロックの内部で、getReports() ヘルパー メソッドを使用して Web サービスからレポートの一覧を取得します。その結果を ArrayList に割り当てます。
Dim myReports As ArrayList = getReports()
ArrayList reports = getReports();
次の行で、SortedList クラスをインスタンス化して、それをその親インターフェイスの IDictionary に渡します。
``` vb
Dim mySortedList As IDictionary = New SortedList
```
``` csharp
IDictionary sortedList = new SortedList();
```
- 次に、reports の各要素によってループする For Each ループを作成します。
``` vb
For Each myPath As String In myReports
Next
```
``` csharp
foreach (string path in reports)
{
}
```
- 次のブロックでは、文字列操作メソッドを使用して各レポートの名前からファイル パスを削除し、文字列リテラルを伴うエスケープ文字で置換します。これらの行を For Each ループの内部に挿入します。
``` vb
Dim myReportNamePrefix As Integer = myPath.LastIndexOf("/") + 1
Dim myReportNameSufix As Integer = myPath.LastIndexOf("?")
Dim myReportNameLength As Integer = myReportNameSufix - myReportNamePrefix
Dim myReportName As String = myPath.Substring(myReportNamePrefix, myReportNameLength)
reportName = reportName.Replace("%20", " ")
```
``` csharp
int reportNamePrefix = path.LastIndexOf(@"/") + 1;
int reportNameSufix = path.LastIndexOf(@"?");
int reportNameLength = reportNameSufix - reportNamePrefix;
string reportName = path.Substring(reportNamePrefix, reportNameLength);
myReportName = myReportName.Replace("%20", " ");
```
- さらに For Each ループの内部で、sortedList IDictionary に切り詰められたレポート名を追加するコードを 1 行追加します。
``` vb
mySortedList.Add(myPath, myReportName)
```
``` csharp
sortedList.Add(path, reportName);
```
並べ替えられたリストの DropDownList コントロールへのバインド
ここでは、IDictionary データ ソースを DropDownList コントロールにバインドする方法を学習します。最初に、IDictionary コレクションのエレメントと DropDownList フィールドの関係を定義します。次に、IDictionary データ ソースを DropDownList コントロールにバインドします。
For Each ループの外部で、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 にバインドします。
``` vb
reportsList.DataBind()
```
``` csharp
reportsList.DataBind();
```
これで、If Not IsPostBack 条件ブロックの内容作成が終了しました。次のセクションでは、Else 条件ブロック内部で、ServerFileReport インスタンスに新しい値を割り当てずにページが最新表示されたときの動作を定義するコードを記述します。
- else 文の内部で、現在のセッションで保留されているレポートに ServerFileReport インスタンスを割り当てます。
Session は一般的なオブジェクトだけを返すため、レポートを目的のレポート タイプにキャストする必要があります。埋め込みレポートと埋め込みでないレポートのどちらを使用している場合でも、取得したオブジェクトを ServerFileReport タイプにキャストします。
``` vb
myServerFileReport = CType(Session("myServerFileReport"),
ServerFileReport)
```
``` csharp
serverFileReport = (ServerFileReport)Session["serverFileReport"];
```
次の行では、ServerFileReport インスタンスを CrystalReportViewer コントロールにバインドします。
myCrystalReportViewer.ReportSource = myServerFileReport
crystalReportViewer.ReportSource = serverFileReport;
[ファイル]メニューの[すべて保存]をクリックします。
[ビルド]メニューで[ソリューションのビルド]を選択します。
ビルド エラーが発生した場合は、ここで修正します。
次のセクションでは、reportsList DropDownList コントロールでの選択に基づいてレポートをバインドするクリック イベントを追加します。