DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MultiView内にDropDownListを配置したGridViewを配置した時のDropDownListのイベントハンドラ

環境/言語:[ASP.NET 3.5]
分類:[ASP.NET]

初めまして。

現在、MultiViewにて一覧画面と詳細画面を実装しているのですが、掲題の件で詰ってしまいました。
以下のような画面を作成しようとしています。
 一覧画面を初期表示
 一覧画面の「選択」押下で詳細画面へ切り替え
 詳細画面では2つの項目をドロップダウンリストで表示し、連動させる

画面遷移ですと出来ているのですが、MultiViewを使用すると、GridView内のコントロールIDが取得できなくなってしまいます。
どなたかご教授頂けないでしょうか。

開発環境は
ASP.NET 3.5(アクションはVB.NET)
VisualStudio2008 です。

以下ソースの抜粋です。

--aspx

<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">

<asp:View ID="VIW1" runat="server">

<asp:GridView ID="GrvItiran" runat="server" AutoGenerateColumns="False"
DataSourceID="odsitiran"
DataKeyNames="hiduke" OnSelectedIndexChanged="Grv1_SelectedIndexChanged">
</asp:GridView>
<asp:ObjectDataSource ID="ods" runat="server"
SelectMethod="" TypeName="">
<SelectParameters>
</SelectParameters>
</asp:ObjectDataSource>

</asp:View>

<asp:View ID="View2" runat="server">

<asp:GridView ID="GrvSyosai" runat="server" DataSourceID="odsSyosai">
<Columns>
<asp:TemplateField HeaderText="aaa" SortExpression="aaa">
<ItemTemplate>
<asp:DropDownList
ID="ddlaaa" runat="server" AppendDataBoundItems="True"
DataSourceID="sdsaaa" DataTextField="aaa" DataValueField="aaa"
SelectedValue='<%# Bind("aaa") %>' >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="bbb" SortExpression="bbb">
<ItemTemplate>
<asp:DropDownList
ID="ddlbbb" runat="server" AppendDataBoundItems="True"
DataSourceID="sdsbbb" DataTextField="sagyokbn" DataValueField="sagyokbn"
SelectedValue='<%# Bind("bbb") %>'>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:View>

</asp:MultiView>

--vb
Protected Sub GrvItiran_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GrvItiran.SelectedIndexChanged
MultiView1.ActiveViewIndex = 1
End Sub

--ここで下の様なイベントを作りたい
Protected Sub ddlaaa_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)


よろしく御願い致します
■No26156に返信(ほうじ茶さんの記事)
> GridView内のコントロールIDが取得できなくなってしまいます。
通常は FindControl でコントロールID を指定してコントロールを取得するの
ですが、いずれかのコントロールの ID を取得したいということでしょうか。
質問内容をうまく読み取れなかったので、今一度お教えいただきたく思いま
す。

> --ここで下の様なイベントを作りたい
> Protected Sub ddlaaa_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

イベントハンドラを用意して、コントロールに OnSelectedIndexChanged を
記述すると善いかと思います。
<asp:DropDownList ID="ddlaaa" runat="server" AppendDataBoundItems="True" DataSourceID="sdsaaa"
    DataTextField="aaa" DataValueField="aaa" SelectedValue='<%# Bind("aaa") %>' 
    OnSelectedIndexChanged="ddlaaa_SelectedIndexChanged">
</asp:DropDownList>
お世話になります。

>> GridView内のコントロールIDが取得できなくなってしまいます。
>通常は FindControl でコントロールID を指定してコントロールを取得するの
>ですが、いずれかのコントロールの ID を取得したいということでしょうか。
>質問内容をうまく読み取れなかったので、今一度お教えいただきたく思いま
>す。

⇒分かりづらい文章で申し訳ございません。
 Protected Sub ddlaaa_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
 のイベントハンドラを作成したいのですが、

<asp:DropDownList ID="ddlaaa" runat="server" AppendDataBoundItems="True" DataSourceID="sdsaaa"
DataTextField="aaa" DataValueField="aaa" SelectedValue='<%# Bind("aaa") %>'
OnSelectedIndexChanged="ddlaaa_SelectedIndexChanged">
</asp:DropDownList>

 のように記述してもイベント発生時(ドロップダウンリスト変更時)に該当Subへ飛んでくれません。デバッグで追いかけようとしたのですが、Page_Loadすら走らずお手上げ状態となっています。ドロップダウンリストのAutoPostBackは"true"です。

また、通常Visual Studio 2008 でコントロールIDを記述する際、入力補完が行われると思うのですが、MultiView内のGridViewにおいたコントロールについては入力補完も行われません。。。
 
よろしく御願い致します
手元にASPがないので検証できませんが、GridViewのSelectedIndexChangedイベントでは駄目でしょうか?
Senderをキャストすれば現在セルも特定できますし。
もりおさん、黒犬さん
ご回答ありがとうございます。

GridViewのSelectedIndexChangedイベントを追記し、デバッグしたところ、
なぜか、ddlaaa_SelectedIndexChangedのイベントが呼び出されるようになりました。(求めていたものではあるのですが。。)

しかしながら、動いた理由、動かなかった理由共に不明であり、
動きはするもののコントロールIDの入力補完は行われない為、引き続き調査し、結果をご報告致します。

お騒がせし、申し訳ございません。
ありがとうございました。
2009/12/29(Tue) 00:31:48 編集(投稿者)

■No26162に返信(ほうじ茶さんの記事)
> イベント発生時(ドロップダウンリスト変更時)に該当Subへ飛んでくれま
> せん。デバッグで追いかけようとしたのですが、Page_Loadすら走らずお手
> 上げ状態となっています。ドロップダウンリストのAutoPostBackは"true"
> です。

Page_Load が走らないということはポストバックさえ行われないということで
しょうか。もう一度 AutoPostBack プロパティが True になっているか確認し
てみてはいかがでしょうか。

> 動きはするもののコントロールIDの入力補完は行われない為、引き続き調査
> し、結果をご報告致します。

GridView や GridViewRow などの INamingContainer 内にコントロールが配置
された場合、コントロールのオブジェクト名は動的に変更されます。
なのでコントロールに直接アクセスすることは出来ないですし、入力補完も
行われないです。
MultiView を用いない場合でも GridView 配下のコントロールには直接
アクセスできないはずです。

コントロールにアクセスするには FindControl で検索してコントロールを取得する必要が
あります。
たとえば GridView の1行目の DropDownList1 を取得したい場合はこんな
感じです。

Dim dropDownList1 As DropDownList = DirectCast(GridView1.Rows(0).FindControl("DropDownList1"), DropDownList)

実際、どのようなオブジェクト名になるかは Page ディレクティブに 
Trace="True" を追加すると見ることが出来たりします。
<%@ Page Language="vb" Trace="True" ...  %>

DOBON.NET | プログラミング道 | プログラミング掲示板