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

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

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

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

.NET Framework

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

ASP.NET

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

Q&A

解決済

3回答

8305閲覧

DataBound後に発生するイベント

doremifa

総合スコア33

C#

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

.NET Framework

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

ASP.NET

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

0グッド

0クリップ

投稿2016/10/31 01:49

###前提・実現したいこと
ページ遷移でセッションからドロップダウンリスト(複数)のインデックスを取得し、SelectedItem.Textを検索条件にしたSQLが書いてあるメソッドをコールしてグリッドを描画したいのですが
Page_LoadではドロップダウンリストがまだDataBoundされていないようで
検索条件に使えないので全てのコントロールのDataBoudが完了した後発生するイベントを探しています。
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
ドットネットフレームワーク4.5.2
C#

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

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

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

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

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

guest

回答3

0

どこかで *.DataBind() みたいなの呼んでいませんか?
OnLoad では取れないというより、DataBind() 呼ぶ前は取れないということではないでしょうか。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7using System.Diagnostics; 8 9namespace Test 10{ 11 public partial class TestEventBind : System.Web.UI.Page 12 { 13 protected void Page_PreInit(object sender, EventArgs e) 14 { 15 // >>> TEST >>>>>>>>>>>>>>>>>>>> 16 ddlHoge.DataSource = new SqlDataSource() 17 { 18 ConnectionString = "Data Source=.\\SQLExpress;Initial Catalog=master;User ID=sa;Password=root;", 19 SelectCommand = " SELECT '111' AS id, 'one' AS name UNION ALL" + 20 " SELECT '222' AS id, 'two' AS name UNION ALL" + 21 " SELECT '333' AS id, 'three' AS name" 22 }; 23 ddlHoge.SelectedIndex = 1; 24 // <<< TEST <<<<<<<<<<<<<<<<<<<< 25 26 Debug.WriteLine("★Page_PreInit [" + ddlHoge.SelectedValue + "]"); 27 } 28 29 protected void Page_Init(object sender, EventArgs e) 30 { 31 Debug.WriteLine("★Page_Init [" + ddlHoge.SelectedValue + "]"); 32 33 this.Test(); 34 } 35 36 protected void Page_Load(object sender, EventArgs e) 37 { 38 Debug.WriteLine("★Page_Load [" + ddlHoge.SelectedValue + "]"); 39 40 //this.Test(); 41 } 42 43 protected void Page_PreRender(object sender, EventArgs e) 44 { 45 Debug.WriteLine("★Page_PreRender [" + ddlHoge.SelectedValue + "]"); 46 } 47 48 protected void Page_UnLoad(object sender, EventArgs e) 49 { 50 Debug.WriteLine("★Page_UnLoad [" + ddlHoge.SelectedValue + "]"); 51 } 52 53 public void Page_DataBind(object sender, EventArgs e) 54 { 55 Debug.WriteLine("★Page_DataBind [" + ddlHoge.SelectedValue + "]"); 56 } 57 58 59 private void Test() 60 { 61 Debug.WriteLine("◇this.DataBind() 前 [" + ddlHoge.SelectedValue + "]"); // 取れない 62 63 this.DataBind(); 64 //ddlHoge.DataBind(); 65 66 Debug.WriteLine("◇this.DataBind() 後 [" + ddlHoge.SelectedValue + "]"); // 取れる 67 } 68 69 } 70}

↓ Page_Init で *.DataBind() を読んだ場合の結果

★Page_PreInit [] ★Page_Init [] ◇this.DataBind() 前 [] ★Page_DataBind [] ◇this.DataBind() 後 [222] ★Page_Load [222] ★Page_PreRender [222] ★Page_UnLoad [222]

外してたらすみません。

投稿2016/10/31 08:04

編集2016/10/31 08:09
sk_3122

総合スコア1126

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

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

doremifa

2016/10/31 08:17

すみません、sk_3122さんの投稿とベストアンサーのタイミングがかぶってしまいました。 おっしゃる通りDataBind前はとれないというお話なのですが DataBindを明示的にやっておらず、aspにタイミングを任せているため page_loadのタイミングではBindされておらず値が使えないのです
guest

0

ベストアンサー

ページAにDropDownListとボタン,ページBにAと同じソースコードのDropDownListとGridViewがあります。

それならばページ B だけあれば、ユーザーは最初からページ B にだけアクセスすれば目的は果たせるのに、何故ページ A からアクセスするのかが謎です。

なので、思い違いがあるかもしれませんが、とりあえずレスします。当方の思い違いがあったら指摘してください。

まず、ユーザーがページ A にアクセスして、DropDownList で項目を選択したらポストバックし、SelectedIndex 情報を Session に格納し、ページ B にリダイレクトするということで良いのですよね?

であれば、ページ B の GridView のデータソースには SqlDataSource または ObjectDataSource などのデータソースコントロールを使い、それの SelectParameters に DropDownList を設定し、PropertyName="SelectedValue" としておいてはいかがですか?

そうしておけば、Page_Load で DropDownList の SelectedIndex プロパティに Session から取得したインデックスの値を設定してやるだけで、やりたいことが実現できるはずです。

GridView のデータソースに SqlDataSource などのデータソースコントロールを使ってないそうですが、使わない理由があるのでしょうか?

データソースコントロールを使うことで、データバインドするタイミングとかその他いろいろなことを自動的に行ってくれますので、特に理由がない限り使うべきなのですが。

【2016/10/31 17:30 追伸】

ページ B は、私の上の回答で述べたように、以下のようにデータソースコントロールを利用して作れば、データバインドのタイミングとかに一切悩む必要はなく、Page_Load 内のコード以外は一行も自力で書く必要もなく、簡単に作れると思います。検討してみてください。

(注:コードの中の Customers, Orders テーブルは Microsoft が提供する Northwind サンプルデータベースのものです)

<script runat="server"> // 2016/10/31 teratail の検証用 // https://teratail.com/questions/53395 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //int selectedIndex = (int)Session["Index"]; の代わりに直接設定 int selectedIndex = 5; DropDownList1.SelectedIndex = selectedIndex; } } </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 [CustomerID], [CompanyName] FROM [Customers]"> </asp:SqlDataSource> <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="CompanyName" DataValueField="CustomerID" AutoPostBack="True"> </asp:DropDownList> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWINDConnectionString %>" SelectCommand="SELECT [OrderID], [CustomerID], [ShippedDate], [Freight], [EmployeeID] FROM [Orders] WHERE ([CustomerID] = @CustomerID)"> <SelectParameters> <asp:ControlParameter ControlID="DropDownList1" Name="CustomerID" PropertyName="SelectedValue" Type="String" /> </SelectParameters> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="OrderID" DataSourceID="SqlDataSource2"> <Columns> <asp:BoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False" ReadOnly="True" SortExpression="OrderID" /> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" SortExpression="CustomerID" /> <asp:BoundField DataField="ShippedDate" HeaderText="ShippedDate" SortExpression="ShippedDate" /> <asp:BoundField DataField="Freight" HeaderText="Freight" SortExpression="Freight" /> <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" SortExpression="EmployeeID" /> </Columns> </asp:GridView> </form> </body> </html>

投稿2016/10/31 07:10

編集2016/10/31 08:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

doremifa

2016/10/31 08:11

いろいろヘンテコなのは私より上位者の書いたコードの変更が良し悪しとは関係なくパワーと時間を必要とするためです。 ですがお二人のお話を総合するとどこか変えないと厳しそうなので(たぶん私が思っているようなイベントはないんですよね?)相談してみます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2016/10/31 08:36

既存のコードを出来るだけ変えたくないということでしたらそれなりの方法はあると思いますが、今質問者さんが提供している情報では具体的にどうすればいいのかは分かりません。とりあえず私の案の具体的なコードを【2016/10/31 17:30 追伸】に追記しておきましたので、検討してみてください。
guest

0

ドロップダウンリストとは、以下のコンボボックスクラスで実現されていると思っていいですか?
System.Windows.Controls.ComboBox
https://msdn.microsoft.com/ja-jp/library/system.windows.controls.combobox(v=vs.110).aspx

DataBoundとはDataBindの書き間違いでしょうか?
https://msdn.microsoft.com/ja-jp/library/ms750612(v=vs.110).aspx

===

ちなみに、Page_Loadの中で DoEvents メソッドを呼び出すとどうなりますか?
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.doevents(v=vs.110).aspx

投稿2016/10/31 03:09

編集2016/10/31 03:12
LaLaLand

総合スコア107

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

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

doremifa

2016/10/31 03:55

>ドロップダウンリストとは、以下のコンボボックスクラスで実現されていると思ってい>いですか? <asp:DropDownList>を使用しています。 >DataBoundとはDataBindの書き間違いでしょうか? おっしゃる通りです。 >ちなみに、Page_Loadの中で DoEvents メソッドを呼び出すとどうなりますか? そのメソッドはどのネームスペースに属するものでしょうか。
退会済みユーザー

退会済みユーザー

2016/10/31 04:32

T-T-T-T-T-T-T-T さん> WPF の質問と勘違いされていませんか? ASP.NET Web Forms アプリの質問のはずですが。あと、DoEvents メソッドは見当違いかと。というか、間違っても使うべきではないものです。 doremifa さん> 質問内容が理解できません。シナリオ的なことを含めてやりたいことを書いていただけませんか? (例:ページ A に DropDownList が実装されている。ページ B に GridView と SqlDataSource が実装されている。最初ユーザーがページ A にアクセスし DropDownList から選択したらポストバックして選択結果を Session に格納し、ページ B にリダイレクトする、ページ B は Session から選択結果情報を取り出し、それに基づきクエリを発行して得た結果を GridView に表示する・・・というように)
LaLaLand

2016/10/31 04:45 編集

ASPの場合、DoEventsに相当するものは無いようでしたので、こちらは忘れてください。 また、asp:DropDownList を回答いただいたことで、実行環境が分かりました。 https://support.microsoft.com/ja-jp/kb/305141 ↑のページは参考になりませんか? 具体的には、「 DataBind イベント」「PreRender イベント」などは参考にならないでしょうか?
doremifa

2016/10/31 05:47 編集

>>T-T-T-T-T-T-T-Tさん 実行環境説明が不足でした。大変申し訳ありません。 >>SurferOnWwwさん ページAにDropDownListとボタン,ページBにAと同じソースコードのDropDownListとGridViewがあります。(sqldatasourceはC#側でSQL作成時に一時的に生成するため設置されてません) DropDownListはどちらもSelectCommandにリストをつくためのSQLが入っており、DataBoundイベントでFindvalueして前ページで選択されているアイテムを再度選択状態にします。 ページAでList選択し、ボタンを押下するとセッションにDropDownListのindexが入ってくる仕様です。 SQLの条件にしたいのはDropDownListのvalueなのですがPageLoadの時点ではまだDropDownListがDataBoundされておらず、FindValueができないため、条件に使いたい 値を取得できないのが目下の問題です。ページの構成やセッション仕様は変えられないので全DropDownListのDataBound後に発生するイベントを探しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問