質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

4500閲覧

FormViewで表示されるラベルコントロールの内容を別ページのDropDownListのデフォルト選択肢に反映させたいです。

taketake221

総合スコア17

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2016/09/08 02:44

編集2016/09/11 05:06

ASP.NET Webフォームアプリに関する質問です。
過去の回答をもとに新しい回答が可能な質問回答機能を考えています。

※OSはWindows7、.NET Framework4、Visual Stdio 2010、SQLserver2012、IE11を利用しています。

以下のような過去の回答一覧が格納されるテーブル(わかりやすいようにレコードはひとつだけですが、本来は複数格納され、ひとつのカード画面にひとつの回答一覧、という具合です)をコントロールを用いて表示します。
イメージ説明
ID : int型、result1 ~ result5 : string型

イメージ説明

表示用のラベルコントロールの内容を回答用ドロップダウンリストのデフォルトの選択肢に反映させることはできないのでしょうか。

「編集」ボタンをおすと(ボタンはItemTemplateに設置)、以下のような回答ページにとびます(別ページ)。
イメージ説明]

この際、遷移前のフォームビューの回答一覧を遷移後の回答ドロップダウンリストの選択肢に反映させることはできないでしょうか。

たとえば、FormViewでの表示が「はい」なら、ドロップダウンリストでデフォルト選択されているのも「はい」といった具合です。

<ドロップダウンリストの選択肢>
※ Text :「はい」 value : はい
Text :「いいえ」 value : いいえ
Text :「未回答」 value : 未回答

※9/11 追記
フォームビューのボタンがクリックされた段階で、フォームビューに回答を表示させるためのラベルの値を読み取り、セッション変数に格納するやり方を考えています。

過去回答テーブルには複数の回答一覧が格納されるため、初期(デフォルト)選択肢は固定でない方が望ましいです。

<全体(フォームビューのものです)>

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ID" DataSourceID="SqlDataSource1" AllowPaging="True"> <EditItemTemplate> <br /> <table cellpadding="0" cellspacing="0" class="style3"> <tr> <td> ID</td> <td> <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' /> </td> </tr> <tr> <td class="style4"> Result1</td> <td class="style4"> <asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind("result1") %>'> <asp:ListItem>はい</asp:ListItem> <asp:ListItem>いいえ</asp:ListItem> <asp:ListItem>未回答</asp:ListItem> </asp:DropDownList> </td> </tr> 'ドロップダウンリスト5つ分 </table> <br /> <asp:Button ID="Button2" runat="server" CommandName="Update" Text="登録" /> <asp:Button ID="Button3" runat="server" CommandName="Cancel" Text="キャンセル" /> &nbsp; </EditItemTemplate> <ItemTemplate> <br /> <table cellpadding="0" cellspacing="0" class="style3"> <tr> <td> ID</td> <td> <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' /> </td> </tr> <tr> <td> Result1</td> <td> <asp:Label ID="result1Label" runat="server" Text='<%# Bind("result1") %>' /> </td> </tr> <tr> <td> Result2</td> <td> <asp:Label ID="result2Label" runat="server" Text='<%# Bind("result2") %>' /> </td> </tr> <tr> <td> Result3</td> <td> <asp:Label ID="result3Label" runat="server" Text='<%# Bind("result3") %>' /> </td> </tr> <tr> <td> Result4</td> <td> <asp:Label ID="result4Label" runat="server" Text='<%# Bind("result4") %>' /> </td> </tr> <tr> <td> Result5</td> <td> <asp:Label ID="result5Label" runat="server" Text='<%# Bind("result5") %>' /> </td> </tr> <tr> <td> &nbsp;</td> <td> &nbsp;</td> </tr> </table> <br /> <asp:Button ID="Button1" runat="server" CommandName="Edit" Text="編集" /> &nbsp; </ItemTemplate> </asp:FormView> </asp:Content>

わかりにくい質問ですが、反応いただけるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twck

2016/09/08 12:39

.aspxファイルのFormViewの部分のソースと、FormViewにデータをバインドしている部分のソースも見せてもらえますか?
guest

回答2

0

ベストアンサー

FormViewでの表示内容を反映させることについては以下の部分の記述方法で一応成功しました。
SelectedValue='<%# Bind("result1") %>'

これは解決したってことでいいんですかね?

一応、それ以外の方法も載せておきます。
データをバインドしたときのイベント内にて値をセットする方法です。

VB

1Private Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 2 3 '新規登録モードのときのみ 4 If FormView1.CurrentMode = FormViewMode.Insert Then 5 6 '初期値用のレコードを読み込んで各コントロールにセットする 7 Using db As New System.Data.SqlClient.SqlConnection(接続文字列) 8 db.Open() 9 Dim cmd = db.CreateCommand() 10 cmd.CommandText = "SELECT * FROM テーブル名 WHERE ID = 初期値のレコードのキー" 11 Using reader = cmd.ExecuteReader 12 If reader.Read Then 13 14 'FormView1の中から各コントロールを探して値をセットする 15 DirectCast(FormView1.FindControl("DropDownList1"), DropDownList).SelectedValue = reader("result1").ToString 16 DirectCast(FormView1.FindControl("DropDownList2"), DropDownList).SelectedValue = reader("result2").ToString 17 DirectCast(FormView1.FindControl("DropDownList3"), DropDownList).SelectedValue = reader("result3").ToString 18 DirectCast(FormView1.FindControl("DropDownList4"), DropDownList).SelectedValue = reader("result4").ToString 19 DirectCast(FormView1.FindControl("DropDownList5"), DropDownList).SelectedValue = reader("result5").ToString 20 End If 21 End Using 22 End Using 23 End If 24 25 '編集モードのときのみ 26 If FormView1.CurrentMode = FormViewMode.Edit Then 27 28 'データを取得する 29 Dim row = DirectCast(FormView1.DataItem, System.Data.DataRowView) 30 31 'FormView1の中から各コントロールを探して値をセットする 32 DirectCast(FormView1.FindControl("DropDownList1"), DropDownList).SelectedValue = row("result1").ToString 33 DirectCast(FormView1.FindControl("DropDownList2"), DropDownList).SelectedValue = row("result2").ToString 34 DirectCast(FormView1.FindControl("DropDownList3"), DropDownList).SelectedValue = row("result3").ToString 35 DirectCast(FormView1.FindControl("DropDownList4"), DropDownList).SelectedValue = row("result4").ToString 36 DirectCast(FormView1.FindControl("DropDownList5"), DropDownList).SelectedValue = row("result5").ToString 37 End If 38End Sub

コードで記述できるため、プロパティだけを使う SelectedValue='<%# Bind("result1") %>' の方法より柔軟性があります。

投稿2016/09/09 04:38

編集2016/09/12 00:00
twck

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taketake221

2016/09/09 06:37

ご回答いただきありがとうございます。 丁寧に記述いただいているにもかかわらず、返信が送れてまして申し訳ありません。 編集モードでのSelectedValue='<%# Bind("result1") %>' で解決したんですが、既存データへの上書きではなく、悩んでいるのが「既存回答を利用した新規データ登録」でして・・・。 無知で申し訳ないのですが、ご提示いただいた方法は単純な上書きケースでなく新規登録の際も
taketake221

2016/09/09 06:44

(上の続きです) 利用可能なんでしょうか・・・?
twck

2016/09/09 08:42

上記のコードに「新規登録モードのとき」に行う処理を追加しました。 新規登録のときは、まず初期値として利用するデータを読み込んで、それを画面に表示するということをすれば実現できると思います。 ただ提示していただいたソースの中を見てみると変更モード用の<EditItemTemplate>タグはあるけど、新規登録モード用の<InsertItemTemplate>タグが無いし、変更モードに入るための CommandName="Edit" のボタンはあるけど、新規登録モードに入るための CommandName="New" のボタンがないので、どうやって新規登録モードに入っているのか分かりません。 どうやって新規登録モードに入っているのか分からないので、追加したコードで実現できるかどうかはちょっと保証できかねますが。
twck

2016/09/09 09:16

質問を見直したら新規登録モード云々と書いてありましたね。 では今の変更モードしかない FormView に新規登録モードを追加するポイントを記述します。 変更モードに入るための Button1 の下に新規登録モードに入るためのボタンを追加します。 <asp:Button ID="Button4" runat="server" CommandName="New" Text="新規" /> 変更画面を定義している EditItemTemplateタグのブロックをコピーして、新規画面用のInsertItemTemplateタグのブロックを作ります。 InsertItemTemplateタグの中の DropDownListに SelectedValue='<%# Bind("result1") %>' は必要ないので削除します。 IDの値を入力できるように IDLabel は削除して、代わりに TextBoxコントロール を入れます。 これらの変更と、DataBoundイベントの処理を追加すれば FormView で新規登録と変更の両方ができるのではないでしょうか。
taketake221

2016/09/09 09:28

たびたびご対応いただき本当にありがとうございます。 <InsertItemTemplate>タグやCommandName="New"の部分は、コード記載時に削ってそのままになっていますね。申し訳ありません。 現在<InsertItemTemplate>のやり方ではなく、教えていただいた Dim row = DirectCast(FormView1.DataItem, System.Data.DataRowView) のコードを使って、ラベルテキストの内容をセッション変数に格納、別ページの新規回答ページに反映させるやり方を考えていたのですが・・・。実現可能なんでしょうか・・・。
taketake221

2016/09/09 09:43

というのも<InsertItemTemplate>ですと「'新規登録モードのときのみ」の処理にも記載いただいていますが、初期選択の並びをデータベースから取得するため固定されてしまうように思いまして・・・。
twck

2016/09/12 00:02

おっと、回答に記述したコードが間違ってました。 If FormView1.CurrentMode = FormViewMode.Insert Then ~ End If の中の以下のコードは DirectCast(FormView1.FindControl("DropDownList1"), DropDownList).SelectedValue = "はい" ではなく DirectCast(FormView1.FindControl("DropDownList1"), DropDownList).SelectedValue = reader("result1").ToString ですね。 回答を修正しました。
twck

2016/09/12 00:32

「Dim row = DirectCast(FormView1.DataItem, System.Data.DataRowView)のコードを使って、ラベルテキストの内容をセッション変数に格納、別ページの新規回答ページに反映させるやり方を考えていたのですが・・・。実現可能なんでしょうか・・・。」についての回答。 できない事はありませんし、新規登録用ページと変更用ページの両方を作るのも珍しくはないと思います。 実現したい動きがいまいち分からないため、わざわざ新規登録用ページを作る必要があるのか疑問なところですが。
twck

2016/09/12 00:43

「初期選択の並びをデータベースから取得するため固定されてしまうように思いまして・・・」についての回答。 複数のレコードがあるのであれば「WHERE ID = 初期値のレコードのキー」の部分を変えて、読み込むレコードを変えればいいだけではないでしょうか? 複数あるレコードのどれを選ぶかという条件が質問文中に書かれていないので、私には答えられませんが。
taketake221

2016/09/12 02:12

twck様、重ね重ねお世話になります。 基本的にすでに格納されているデータに上書きすることはないので、回答はすべて新規登録の扱いです。また、本来は回答一覧だけでなく回答の点数も同じテーブルに格納(回答終了ボタンクリック→点数計算、格納)しているので、単純なItemInsertingプロシージャ内に処理を書くより、回答ページを別に作る方法を考えました。 初期選択のレコード選択ですが、 フォームビューに表示されている一覧のIDが1 →回答ドロップのデフォルトもID=1の並び 表示一覧のIDが2ならデフォルトの並びも2といった具合ですので、条件というほどのものでもありません。 セッション変数を扱って別ページで、という方法にしても、回答一覧のIDが取得(読み取れれば)できるのではないかと考えたのですが・・・。 記述・説明不足で申し訳ありません・・・。
twck

2016/09/12 05:01

「新規登録だけで変更はない」、「FormViewに表示されているデータを初期値とする」のであれば、Button2 の CommandName を "Update" から "Insert" に変更するというのはいかがでしょうか? これによりButton2をクリックすると変更モードだが新規登録用のSQL文(SqlDataSource1のInsertCommand)が実行されると思いますが。 操作の流れとしては以下のようになります。 1.ユーザーが FormView1 に初期値としたいデータを表示させる。 2.ユーザーが Button1(編集ボタン) をクリックする。 3.Button1 の CommandName は "Edit" なので、編集モードに移行する。 4.編集モードなので <EditItemTemplate> のレイアウトの中に、データが初期値として表示される。DropDownListへの初期値表示は SelectedValue='<%# Bind("result1") %>' で行う。 5.ユーザーが答えを編集した後、Button2(登録ボタン) をクリックする。 6.Button2 の CommandName は上記の通り "Update" から "Insert" に変更してあるので、新規登録用のSQL文(SqlDataSource1のInsertCommand)が実行される。
twck

2016/09/12 06:13

上記のように変更して「新しいレコードを挿入するために挿入モードでなければなりません」という例外が表示されるようだったら、Form_Loadイベント辺りで以下のようにモードを調整するコードを追加する。 If FormView1.CurrentMode = FormViewMode.Edit Then FormView1.ChangeMode(FormViewMode.Insert) End If
taketake221

2016/09/14 18:18

ご回答いただきありがとうございます。重ね重ねお世話になります。 しばらく返信・作業ができない状態で反応が大幅に遅れてしまい誠に申し訳ありません。 引き続きその状態が続く見込みですので、ひとまずご回答へのお礼を。 いただいたご回答の内容を試してみて、後日改めての返信とさせてください。 申し訳ありません。
taketake221

2016/10/02 06:36

前回の返信をお送りしてからだいぶ時間が経過してしまい申し訳ありません。 紆余曲折をへて、こちらが想定していた仕様と大きく異なり、結局新規登録云々は立ち消えとなり、単純に上書き編集におけるラベルコントロールの反映ですみました。 丁寧にご回答いただいていたにもかかわらず、こちらの反応が遅れに遅れてしまい本当に申し訳ありませんでした。 お詫びもしきれませんが、ベストアンサーを押させていただきますね。
guest

0

ソースの掲示がされてないので、
推測を交えた回答となりますが、
以下のようなイメージでやりたい事が行えるのではないでしょうか?

C#

1dropdownlist1.ClearSelection(); // 事前に選択状態をクリアしておく 2 3string selectValue = "はい"; // 選択したい項目値 4var item = dropdownlist1.Items.FindByValue(selectValue); 5if (item != null){ 6 item.Selected = true; 7}

下記はVB版

VB

1dropdownlist1.ClearSelection() ' 事前に選択状態をクリアしておく 2 3Dim selectValue As String = "はい" ' 選択したい項目値 4Dim item = dropdownlist1.Items.FindByValue(selectValue) 5If item IsNot Nothing Then 6 item.Selected = True 7End If

以下は各メソッド・プロパティのmsdnによる解説です、参考までにどうぞ。
(機械語翻訳で日本語が怪しい所があります^^;)

ClearSelectionメソッド
FindByValueメソッド
Selectedプロパティ

投稿2016/09/08 13:20

編集2016/09/08 13:31
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taketake221

2016/09/09 07:43

重ね重ねお世話になります。ご回答いただきありがとうございます。 返信が大幅に遅れてしまい申し訳ありません。 不足かもしれませんが、フォームビューのソースは追加記載いたしました。 編集モード時における単純な反映については成功したのですが、新規回答用フォームに反映させるしくみで苦悩中です。 反応いただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問