|
分類:[VB.NET]
分類:[VB.NET]
はじめてこちらにたどりついたものです。
いろいろ調べてもどうしても解決できず書き込みさせていただきます。
VB.NET(Framework2.0)で開発しています。IDEはVWD2005Expressです。
DetailsViewがEditモードになった時に DetailsView上に二つのDropDownListを配置しています。
一つ目のDropDownListは静的ObjectDataSourceでリストを設定しています。 SelectedValueはDetailsViewのDataSourceよりEvalでとってます。
--------source---------- 一つ目 <EditItemTemplate> <asp:DropDownList ID="ddlCategory" runat="server" DataSourceID="CategoryListDataSource" DataTextField="Category Name" DataValueField="Category ID" SelectedValue='<%# Eval("[Category ID]")%>' AutoPostBack="True" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" > </asp:DropDownList> </EditItemTemplate> 二つ目 <EditItemTemplate> <asp:DropDownList ID="ddlProduct" runat="server" DataTextField="Product Name" DataValueField="Product ID" AutoPostBack="True" OnSelectedIndexChanged="ddlProduct_SelectedIndexChanged" > </asp:DropDownList> </EditItemTemplate>
二つ目のDropDownListの初期リストはDetailsViewのOnDataBoundメソッドの中で 一つ目のDropDownListの値を使って動的にObjectDataSourceをバインドして設定してます。 SelectedValueは退避させておいたラベルより同じOnDataBoundメソッドの最後に設定してます。
--------source---------- Protected Sub detailsView_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
If detailsView.CurrentMode = DetailsViewMode.Edit Then
ProductListDataSource.SelectParameters.Clear() ProductListDataSource.SelectParameters.Add(New Parameter("categoryID"), TypeCode.String, CType(detailsView.FindControl("ddlCategory"), DropDownList).SelectedValue))
CType(detailsView.FindControl("ddlProduct"), DropDownList).DataSource = "ProductListDataSource" CType(detailsView.FindControl("ddlProduct"), DropDownList).DataBind() CType(detailsView.FindControl("ddlProduct"), DropDownList).SelectedValue = CType(detailsView.FindControl("lblProduct"), Label).Text
End If End Sub
EditモードでDetailsViewが表示された後、一つ目のDropDownListを変更するとSelectedIndexChangedメソッドが発生し、そのメソッドの中で二つ目のDropDownListのリストを動的に書き直します。
--------source---------- Protected Sub ddlCategory_SelectedIndexChanged(ByVal sender As Object, Byval e As System.EventArgs)
CType(detailsView.FindControl("ddlProduct"), DropDownList).Items.Clear() CType(detailsView.FindControl("ddlProduct"), DropDownList).ClearSelection() ProductListDataSource.SelectParameters.Clear() ProductListDataSource.SelectParameters.Add(New Parameter("categoryID",TypeCode.String, CType(detailsView.FindControl("ddlCategory"),DropDownList).SelectedValue)) CType(detailsView.FindControl("ddlProduct"),DropDownList).SelectedValue = Nothing CType(detailsView.FindControl("ddlProduct"),DropDownList).DataSource = ProductListDataSource CType(detailsView.FindControl("ddlProduct"),DropDownList).DataBind()
End Sub
ここまでは思ったとおりに動いてくれてます。
ところがその後二つ目のDropDownListの選択ができません。 一つ目のDropDownListを初期値に選択しなおすと二つ目のDropDownListが変更可能になりますが、一つ目のDropDownListを変更すると二つ目のDropDownListのリストは書き直されますがいつも一番上が選択された状態になってしまいす。
debugすると一つ目のDropDownListが変更された後に、二つ目のDropDownListをッ変更すると、なぜか一つ目のDropDownListのSelectedIndexChangedメソッドが呼ばれてSelectedValue=Nothingを通っているようなのですが、一つ目のDropDownListが初期値の場合は二つ目のDropDowList変更時に一つ目のSelectedIndexChangedメソッドが呼ばれていません。
説明がわかりづらくてすいません。 要は一つ目のDropDownList変更→二つ目のDropDownListのリスト書き直し→二つ目のDropDownList選択、という処理ができればいいんですが・・・。
どなたかお知恵をお貸しいただければ幸いです。 よろしくお願いいたします。
|