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

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

ただいまの
回答率

90.75%

  • C#

    6568questions

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

  • ASP.NET

    481questions

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

  • .NET Framework

    425questions

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

DataBound後に発生するイベント

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 960

doremifa

score 25

前提・実現したいこと

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

補足情報(言語/FW/ツール等のバージョンなど)

ドットネットフレームワーク4.5.2
C#

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;

namespace Test
{
    public partial class TestEventBind : System.Web.UI.Page
    {
        protected void Page_PreInit(object sender, EventArgs e)
        {
            // >>> TEST >>>>>>>>>>>>>>>>>>>>
            ddlHoge.DataSource = new SqlDataSource()
            {
                ConnectionString = "Data Source=.\\SQLExpress;Initial Catalog=master;User ID=sa;Password=root;",
                SelectCommand = " SELECT '111' AS id, 'one'   AS name UNION ALL" +
                                " SELECT '222' AS id, 'two'   AS name UNION ALL" +
                                " SELECT '333' AS id, 'three' AS name"
            };
            ddlHoge.SelectedIndex = 1;
            // <<< TEST <<<<<<<<<<<<<<<<<<<<

            Debug.WriteLine("★Page_PreInit       [" + ddlHoge.SelectedValue + "]");
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            Debug.WriteLine("★Page_Init          [" + ddlHoge.SelectedValue + "]");

            this.Test();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            Debug.WriteLine("★Page_Load          [" + ddlHoge.SelectedValue + "]");

            //this.Test();
        }

        protected void Page_PreRender(object sender, EventArgs e)
        {
            Debug.WriteLine("★Page_PreRender     [" + ddlHoge.SelectedValue + "]");
        }

        protected void Page_UnLoad(object sender, EventArgs e)
        {
            Debug.WriteLine("★Page_UnLoad        [" + ddlHoge.SelectedValue + "]");
        }

        public void Page_DataBind(object sender, EventArgs e)
        {
            Debug.WriteLine("★Page_DataBind      [" + ddlHoge.SelectedValue + "]");
        }


        private void Test()
        {
            Debug.WriteLine("◇this.DataBind() 前 [" + ddlHoge.SelectedValue + "]"); // 取れない

            this.DataBind();
            //ddlHoge.DataBind();

            Debug.WriteLine("◇this.DataBind() 後 [" + ddlHoge.SelectedValue + "]"); // 取れる
        }

    }
}

↓ 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 17:17

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

    キャンセル

checkベストアンサー

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 17:11

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

    キャンセル

  • 2016/10/31 17:36

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

    キャンセル

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 12:55

    >ドロップダウンリストとは、以下のコンボボックスクラスで実現されていると思ってい>いですか?
    <asp:DropDownList>を使用しています。

    >DataBoundとはDataBindの書き間違いでしょうか?
    おっしゃる通りです。

    >ちなみに、Page_Loadの中で DoEvents メソッドを呼び出すとどうなりますか?
    そのメソッドはどのネームスペースに属するものでしょうか。

    キャンセル

  • 2016/10/31 13: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 に表示する・・・というように)

    キャンセル

  • 2016/10/31 13:42 編集

    ASPの場合、DoEventsに相当するものは無いようでしたので、こちらは忘れてください。

    また、asp:DropDownList を回答いただいたことで、実行環境が分かりました。

    https://support.microsoft.com/ja-jp/kb/305141
    ↑のページは参考になりませんか?
    具体的には、「 DataBind イベント」「PreRender イベント」などは参考にならないでしょうか?

    キャンセル

  • 2016/10/31 14:46 編集

    >>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後に発生するイベントを探しています。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6568questions

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

  • ASP.NET

    481questions

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

  • .NET Framework

    425questions

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