共有フォルダリスト画面の Web アプリの方です。
左が開発画面で右が実行画面です。(どれもクリックすると新しいウィンドウで拡大図が表示されます。)
ObjectDataSource のビジネスオブジェクトは Volume クラスを指定してます。
※Volume クラスの詳細はこちら(VB版 C#版)
デザイナでは次の設定をしてます。
・FolderDataSource の SELECT 操作として GetVolumes メソッドを選択
・一覧 ListBox の AutoPostBack を True にし、DataSourceID に FolderDataSource を、DataTextField と DataValueField に Name を指定
・DetailDataSource の SELECT 操作として FindByName メソッドを選択
・パラメーター ソースは「Control」を選択し、ControlID は一覧 ListBox の ID を選択
・詳細 FormView の DataSourceID に DetailDataSource を指定
・FormView を囲む UpdatePanel の AsyncPostBackTrigger に 一覧 ListBox の SelectedIndexChanged を指定
コードでは次の処理をしてます。
1. 一覧 ListBox 用 ObjectDataSource の SELECT 操作完了時(Selected イベント)に、取得した共有フォルダの数を表示
2. 詳細 FormView 用の ObjectDataSource の SELECT 操作前(Selecting イベント)に、共有フォルダが未選択ならイベントをキャンセル
3. 詳細 FormView 用の ObjectDataSource の SELECT 操作完了時(Selected イベント)に、選択された共有フォルダを変数に保持
4. 詳細 FormView のデータバインド後(DataBound イベント)に、共有フォルダが選択されてたら その Keywords プロパティの値を改行で連結した文字列にしたものをキーワード TextBox の Text プロパティに設定
5. 戻るボタンをクリックすると遷移前の状態のメインページに戻る
VB
Private selectedFolder As Volume
Private Sub FolderDataSource_Selected(
sender As Object, e As ObjectDataSourceStatusEventArgs) Handles FolderDataSource.Selected
Me.CountLabel.Text = String.Format("{0} 個のオブジェクト", DirectCast(e.ReturnValue, ICollection).Count)
End Sub
Private Sub DetailDataSource_Selecting(
sender As Object, e As ObjectDataSourceSelectingEventArgs) Handles DetailDataSource.Selecting
If Me.FolderListBox.SelectedIndex = -1 Then
e.Cancel = True
End If
End Sub
Private Sub DetailDataSource_Selected(
sender As Object, e As ObjectDataSourceStatusEventArgs) Handles DetailDataSource.Selected
selectedFolder = DirectCast(e.ReturnValue, Volume)
End Sub
Private Sub DetailFormView_DataBound(sender As Object, e As EventArgs) Handles DetailFormView.DataBound
If Me.FolderListBox.SelectedIndex >= 0 Then
Dim txt = DirectCast(Me.DetailFormView.FindControl("KeywordTextBox"), TextBox)
txt.Text = String.Join(Environment.NewLine, selectedFolder.Keywords)
End If
End Sub
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Response.Redirect("Main.aspx?idx=5")
End Sub
C#
private Volume selectedFolder;
protected void FolderDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
this.CountLabel.Text = String.Format("{0} 個のオブジェクト", ((ICollection)e.ReturnValue).Count);
}
protected void DetailDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
if (this.FolderListBox.SelectedIndex == -1)
{
e.Cancel = true;
}
}
protected void DetailDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
selectedFolder = (Volume)e.ReturnValue;
}
protected void DetailFormView_DataBound(object sender, EventArgs e)
{
if (this.FolderListBox.SelectedIndex >= 0)
{
var txt = (TextBox)this.DetailFormView.FindControl("KeywordTextBox");
txt.Text = String.Join(Environment.NewLine, selectedFolder.Keywords);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("Main.aspx?idx=5");
}
Volume.Keywords プロパティは String の配列です。
Windows アプリの方は TextBox.Lines プロパティが対応してるのでそのままセットできるんですが、Web アプリの方は TextBox.Text プロパティに対応させるしかないので、改行で連結した文字列をセットしてます。