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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

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

Q&A

解決済

1回答

6574閲覧

SqlDataSourceの処理実行タイミング

makao

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

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

0グッド

1クリップ

投稿2016/10/05 09:54

###質問内容
・SqlDataSourceの実行されるタイミングについて

###発生している問題
DropDownlistをPage_LoadでSelectedIndexしようとしているが
まだ中身が生成されていないらしくFindByValueであるべきItemが見つからない。

###該当のソースコード

html

1<asp:DropDownList ID="DropDown1" runat="server" style="vertical-align: middle;" DataSourceID="SqlDataSource1" DataTextField="名称" DataValueField="区分" AppendDataBoundItems="true"> 2 <asp:ListItem Value="" Text="" /> 3</asp:DropDownList> 4<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AAAConnectionString %>" SelectCommand="SELECT [区分], [名称] FROM [マスタテーブル] WHERE ([有効FLG] = @有効FLG) ORDER BY [区分]"> 5 <SelectParameters> 6 <asp:Parameter DefaultValue="true" Name="有効FLG" Type="Boolean" /> 7 </SelectParameters> 8</asp:SqlDataSource> 9 10```c# 11protected void Page_Load(object sender, EventArgs e){ 12 13//reader=command.ExecuteReader() テーブルから対象レコード1件取得(区分はマスタテーブルに存在するもの) 14li = DropDown1.Items.FindByValue(reader["区分"].ToString()); 15i = DropDown1.Items.IndexOf(li); 16DropDown1.SelectedIndex = i; 17}
###補足情報(言語/FW/ツール等のバージョンなど) html書き直し等できないため処理実行のイベントタイミングの変更で対応したい

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

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

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

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

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

guest

回答1

0

ベストアンサー

Page_Load の時点では、質問者さんの言われるとおり、DropDownList にデータバインドされていませんので、Page_load ではなく DropDownList.DataBound イベントのハンドラで設定すればうまくいくのではないかと思います。

お試しください。ダメならその旨連絡ください。実際にコードを書いて検証してみます。

【2016/10/6 10:50 追記】

私の 2016/10/06 10:24 のコメントで「具体例はあとで回答欄に追記しておきます」と書きましたように、すべて Page.Load イベントで行う例を書いておきます。データベースは Microsoft が提供しているサンプルデータベース Northwind の Employees テーブルを使っています。Button はポストバックした時の動作の確認用です。

<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> // 2016/10/5 teratail の検証用 // https://teratail.com/questions/50422 protected void DropDownList1_DataBound(object sender, EventArgs e) { // EmployeeID = 7 の LastName は King //ListItem item = DropDownList1.Items.FindByValue("7"); //int index = DropDownList1.Items.IndexOf(item); //DropDownList1.SelectedIndex = index; } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { DropDownList1.DataSource = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty); DropDownList1.DataBind(); // EmployeeID = 7 の LastName は King ListItem item = DropDownList1.Items.FindByValue("7"); int index = DropDownList1.Items.IndexOf(item); DropDownList1.SelectedIndex = index; } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWINDConnectionString %>" SelectCommand="SELECT [EmployeeID], [LastName] FROM [Employees]"> </asp:SqlDataSource> <asp:DropDownList ID="DropDownList1" runat="server" DataTextField="LastName" DataValueField="EmployeeID" OnDataBound="DropDownList1_DataBound"> </asp:DropDownList> <asp:Button ID="Button1" runat="server" Text="Button" /> </form> </body> </html>

投稿2016/10/05 10:29

編集2016/10/06 01:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

makao

2016/10/06 00:08

ご教示いただいたDataBound での実装は可能でした。 機能要件的には満たせているのですがDataBound ごとにDBアクセスが発生してしまう点 若干懸念があります。 (規約がうるさく、スコープ内で完結させる必要があるため事前にDataSetもつ等の対策が打てない) 一括でDropDownListに対し処理できるハンドラもしあったらお願いします。
退会済みユーザー

退会済みユーザー

2016/10/06 01:24

> DataBound ごとにDBアクセスが発生してしまう点 > 若干懸念があります。 DropDownList の ViewState が有効なら(デフォルトで有効)、DataBound イベントは初回しか発生しないです。つまり、DB にアクセスするのは初回のみになります。 ポストバックした際は ViewState の情報を使うので、DB にはアクセスしませんし、DataBound イベントは発生しません。 DataBound イベントのハンドラにブレークポイントを設定して、DropDownList の EnableViewState が Ture(デフォルト)、False でどう違うか、ご自分で検証してみてください。 > スコープ内で完結させる必要があるため > 事前にDataSetもつ等の対策が打てない 「スコープ内」とはどういうことでしょう? 何らかの理由でどうしても Page.Load イベントのハンドラで設定したいということですが? であればその理由を教えてください。 「DataSetもつ等の対策が打てない」というのも自分には分かりません。SqlDataSource はデフォルトで(DataSourceMode プロパティが DataSet)データを DataSet オブジェクトに読み込み、サーバー上のメモリに格納するのですが。 > 一括でDropDownListに対し処理できるハンドラもしあった > らお願いします。 これも意味が分かりませんが、どうしても Page.Load イベントのハンドラ内で全て行いたいということであれば、SqlDataSource による自動バインディングに頼らず(DropDownList の DataSourceID に SqlDataSource は設定せず)、自分でコードを書いて Select メソッドでデータを取得してそれをバインドしてから FindByValue を使うことはできます。 具体例はあとで回答欄に追記しておきます。
makao

2016/10/06 01:42 編集

>デフォルトで(DataSourceMode プロパティが DataSet)データを DataSet オブジェ>クトに読み込み、サーバー上のメモリに格納するのですが 規約によりコーディングに制限があります。 (なぜだかよくわかりませんが)DBのデータを使う場合、そのイベント内で毎度取得に行かねばならず、DropDownListがあるだけ毎度毎度コネクションをはって取得にいくロジックを書かねばなりません(個人的にはメンテしにくいだけだと思うのですが) Page_Loadに拘っているのではなくHTMLをなかなか直させてくれないので なので全DropDownListの中身が入っている状態のイベント1つのスコープ内で一度だけDBアクセスし、全DropDownListのSelectedIndexを操作する方向で話をもっていければと。
退会済みユーザー

退会済みユーザー

2016/10/06 01:55

依然として「スコープ」等の意味が理解できていませんが、とりあえず Page_Load 内で設定する例を回答欄に書いておきました。これでも NG なら具体的にその理由を連絡ください。
makao

2016/10/06 01:59 編集

ご教示いただいた方法で実装できそうです。 サンプルまで用意いただけるとは大変恐縮、尽力感謝!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問