@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

2つのDropDownListを連動し、更にFormViewで修正する

1
投稿者投稿内容
みかりん☆ミ
会議室デビュー日: 2009/03/29
投稿数: 4
投稿日時: 2009-03-29 16:29
いつもお世話になります。

ASP.NET 2.0
C#
Windows2000 と WindowsXP
Mirrosoft SQL 2005 Express Edition
上記の環境で開発しています。

今やりたいのは、2つのDropDownListのデータベースから読み込み連動し、
更にFormViewで修正しても、同様に連動したいのです。

データベースは、
<KoushuMaster>
工種ID|工種名
−−−−−−−−−
1 |工種A
2 |工種B
3 |工種C

<HinmokuMaster>
品目ID |品目名
−−−−−−−−−
1 |品目A
2 |品目B
3 |品目C

連動(絞込)させるためのデータベース
<KHMaster>
工種ID |品目ID
−−−−−−−−−
1 |1
1 |2
2 |1
2 |3
3 |1
3 |2
3 |3

1つ目のDropDownList(Koushu)を選択したら、
2つ目のDropDownList(Hinmoku)が連動(絞込)するようにしたいため、
下記のように、FormViewのInsertItemTemplateに記述しました。

==========FormViewのInsertItemTemplateここから=========
<asp:SqlDataSource ID="sds_koushu" runat="server"
ConnectionString="<%$ ・・・・・・ %>" ProviderName="<%$ ・・・・・・ %>"
SelectCommand="select [工種ID],[工種名] from dbo.KoushuMaster />
<asp:DropDownList ID="Koushu" runat="server"
DataSourceID="sds_koushu" AutoPostBack="True"
DataValueField="工種ID" DataTextField="工種名" />

<asp:SqlDataSource ID="sds_kh" runat="server"
ConnectionString="<%$ ・・・・・・ %>" ProviderName="<%$ ・・・・・・ %>"
SelectCommand="select K.[品目ID],H.[品目名] from dbo.KHMaster as K left join dbo.HinmokuMaster as H on K.[品目ID]=H.[品目ID] WHERE (K.[工種ID] = @KoushuID)">
<SelectParameters>
<asp:ControlParameter ControlID="Koushu" Name="KoushuID" PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>
<asp:DropDownList ID="Hinmoku" runat="server"
DataSourceID="sds_kh" AutoPostBack="True"
DataValueField="品目ID" DataTextField="品目名" />

==========FormViewのInsertItemTemplateここまで=========

InsertItemTemplateでは、これでうまく連動(絞込)しています。
ところが、EditItemTemplateではDataBoundを利用し、
修正内容を読み込むためのSelectValueを下記のように追加すると、
正しく読み込みますが、一つ目のDropDownList(Koushu)を変更しようとすると、
SelectValueが邪魔するのか、
「Eval()、XPath()、および Bind() のようなデータバインド メソッドは、データバインドされたコントロールのコンテキストでのみ使用することができます。」
となり、連動(絞込)処理が出来ません。

==========FormViewのEditItemTemplateここから=========
<asp:SqlDataSource ・・・・・・・・・・ />
<asp:DropDownList ID="Koushu" runat="server"
DataSourceID="sds_koushu" AutoPostBack="True"
DataValueField="工種ID" DataTextField="工種名"
SelectedValue='<%# Bind("工種ID") %>' />

<asp:SqlDataSource ・・・・・・・・・・ />
<asp:DropDownList ID="Hinmoku" runat="server"
DataSourceID="sds_kh" AutoPostBack="True"
DataValueField="品目ID" DataTextField="品目名"
SelectedValue='<%# Bind("品目ID") %>' />

==========FormViewのEditItemTemplateここまで=========

どうやって修正したら良いか、ご伝授下さい。
よろしくお願い致します。

[ メッセージ編集済み 編集者: みかりん☆ミ 編集日時 2009-04-01 12:44 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-29 22:39
FormView自体のデータソースがわからないんでなんともいえませんが、最後の
SelectedValue='<%# Bind("品目ID") %>'
はいらないんじゃないですか?
みかりん☆ミ
会議室デビュー日: 2009/03/29
投稿数: 4
投稿日時: 2009-03-30 00:11
引用:

べるさんの書き込み (2009-03-29 22:39) より:
FormView自体のデータソースがわからないんでなんともいえませんが、最後の
SelectedValue='<%# Bind("品目ID") %>'
はいらないんじゃないですか?




回答、ありがとうございます。
FormView自体のデータベースは、製品を保存しているデータです。

<Seihin>table
見積No |製品ID |工種ID |品目ID |製品名
-----------------------------------------
1    |1    |1    |1    |製品A
1    |2    |1    |2    |製品B
3    |3    |2    |1    |製品C
4    |4    |2    |3    |製品D

製品のテーブルは、上記のようが、
製品を修正する画面ですので、1行のみ読み込んで
FormViewに表示しています。

SelectedValue='<%# Bind("品目ID") %>'を無しにすると、
もちろんうまく行きます。(連動が外れるため)
ですが、EditItemTemplateでは、
工種名も品目名も読み込む必要があるため、
SelectedValue='<%# Bind("工種ID") %>'
SelectedValue='<%# Bind("品目ID") %>' ともに、
必要なんです。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-30 01:28
FormView1のDataBoundイベントハンドラで
if(FormView1.CurrentMode==FormViewMode.Edit)
{
((DropDownList)FormView1.FindControl("Hinmoku")).SelectedValue =
((DataRowView)FormView1.DataItem)["品目ID"].ToString();
}
などとしてはどうでしょう。
みかりん☆ミ
会議室デビュー日: 2009/03/29
投稿数: 4
投稿日時: 2009-04-01 12:35
引用:

べるさんの書き込み (2009-03-30 01:28) より:
FormView1のDataBoundイベントハンドラで
if(FormView1.CurrentMode==FormViewMode.Edit)
{
((DropDownList)FormView1.FindControl("Hinmoku")).SelectedValue =
((DataRowView)FormView1.DataItem)["品目ID"].ToString();
}
などとしてはどうでしょう。



出来ました。べる様、ありがとうございました。
DropDownList に今まで全く気付かなかった不具合があって、
ご提案して頂いた方法でも出来なくて、困っていたのですが、
その不具合を特定し、修正後に、
ご提案して頂いたようにやったら、出来ました。
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)