###前提・実現したいこと
ページ遷移でセッションからドロップダウンリスト(複数)のインデックスを取得し、SelectedItem.Textを検索条件にしたSQLが書いてあるメソッドをコールしてグリッドを描画したいのですが
Page_LoadではドロップダウンリストがまだDataBoundされていないようで
検索条件に使えないので全てのコントロールのDataBoudが完了した後発生するイベントを探しています。
よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
ドットネットフレームワーク4.5.2
C#
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア1126
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/31 08:36
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総合スコア107
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/31 03:55
退会済みユーザー
2016/10/31 04:32
2016/10/31 04:45 編集
2016/10/31 05:47 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/31 08:17