none
Webフォームで検索ボタン付きの一覧表示画面の作り方 RRS feed

  • 質問


  • Webサイトプロジェクト、Webフォームで開発をしています。

    検索条件とソート指定(コンボボックス)を入力し、「検索」ボタンで検索実行して ListView + DataPager でページング付きの一覧表示をするという、ごくごく一般的な画面を作成しています。
    インターネットに普通にころがっているサンプルをまねて作ってみたのですが、何もしないと、初期表示でデータを検索しにいってしまいます。

    そこで、

    public partial class _Default : System.Web.UI.Page
    {
        // 画面初期表示時(ListViewを隠す)
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ListView1.Visible = false;
            }
        }
        
        // 検索ボタン押下時
        protected void Button1_Click(object sender, EventArgs e)
        {
            // 現ページをリセットする
            DataPager1.SetPageProperties(0, DataPager1.MaximumRows, false);
    
            // バインドし直し
            ListView1.DataBind();
            ListView1.Visible = true;
        }
    }
    

    などと、いろいろと試行錯誤の上なんとかそれっぽい動きになったのですが、これって一般的な処理なのでしょうか?
    何か初回表示は見えなくしているだけで、無駄な検索をしてそうな気がしているのですが、C#もWeb開発(ASP.NET)も初めてで正しい処理なのかそうでないのかの判断が付きません。

    インターネットでいろいろとサンプルを検索しているのですが、ほとんどが検索条件も検索ボタンもない(一般的な業務画面ではありえない)一覧表示のサンプルばかりで、求めるものが見当たりません。

    ここにいいサンプルがあるよというURLでも結構ですのでお教え願えませんでしょうか?

    2014年6月9日 2:50

回答

  • > 初期表示のときに勝手にListViewにデータ(全件)が表示されてしまうこと(これをどう回避した
    > らよいか)と、アップしたような Button1_Click() のイベントハンドラーで問題ないかというこ
    > とです。

    そこのところだけが気になっていたということでしょうか? であれば、余計なことをいろいろ質問してすみませんでした。

    ListView1.Visible = false; に設定すれば、DB にはデータを取りに行かないので、初期表示時に無駄な選択をしていることはないと思います。

    初期表示時にデータバインド系のイベントが発生するか否かで調べられると思います。


    以下は余計なお世話かもしれませんが・・・

    ヘッダを LinkButton にして、それをクリックすることによってソートするのがよく行われている方法です。ListView でも同様なことは可能です。

    ListView でソート(行の並び替え)
    http://surferonwww.info/BlogEngine/post/2012/05/26/Sorting-on-ASPNET-ListView.aspx

    ただし、

    > OjectDataSource + Tableアダプター + ページング用の拡張メソッド

    の「ページング用の拡張メソッド」というのが、表示する部分だけ切り出すようなメソッドだとするとうまく行きませんが。

    • 回答としてマーク Ticky4649 2014年6月9日 9:43
    2014年6月9日 8:48

すべての返信

  • 開発環境(OS, IIS, .NET, Visual Studio のバージョンなど)を書いてください。(前回の質問と同じと言われるかもしれませんが、それならコピペするだけで済みますし、回答者・一般閲覧者の手間を省くためにも書いてください)


    > 検索条件とソート指定(コンボボックス)を入力し、「検索」ボタンで検索実行して
    > ListView + DataPager でページング付きの一覧表示をするという、ごくごく一般的
    > な画面を作成しています。
    > インターネットに普通にころがっているサンプルをまねて作ってみたのですが、何も
    > しないと、初期表示でデータを検索しにいってしまいます。

    やりたいことがわかりません。全体のシナリオが理解できる程度の簡単な例で結構ですので、以下のことに回答いただけるでしょうか?

    (1) ListView に表示する DB のテーブルの内容

    (2) 「検索条件」を入力する UI は何ですか?

    (3) 「ソート指定」とはどういうことですか? 選択条件とは別にソート条件を指定するのですか?

    (4) 「コンボボックス」とは何ですか?(DropDownList の間違い?)

    (5) 「検索条件」と「ソート指定」を基にどのように DB から抽出するのですか?(DB のテーブルのある項目を「検索条件」として WHERE 句で絞り込み、「ソート指定」を ORDER BY 句に指定して抽出する?)

    (6) 初期画面の「選択条件」と「ソート指定」どのようにして、ListView には何を表示したいのですか?(初期画面は何も表示しない?)

    (7) ページングは「選択条件」と「ソート指定」と何か関係があるのですか?(なさそうに思えるのですが)

    これらが分からないと的を得た回答をするのが難しいです。


    • 編集済み SurferOnWww 2014年6月9日 5:41 誤字訂正
    2014年6月9日 5:40
  • SurferOnWww さん、レスありがとうございます。

    環境は以下の通りです。

    Windows 7
    Visual Studio 2013 for Web
    IIS Express ? (Visual Studioに付属のもの)
    SQL Server Express 2012 の LocalDB
    言語: C#
    Webサイトプロジェクト

    >(1) ListView に表示する DB のテーブルの内容
    select * from Production.BillOfMaterials といった内容です(MSのサンプルDB AdventureWorksを使っています)。

    >(2) 「検索条件」を入力する UI は何ですか?
    TextBoxです。必須項目ではないので、何も入力されていない場合は、全件対象となります。

    >(3) 「ソート指定」とはどういうことですか? 選択条件とは別にソート条件を指定するのですか?
    はい。たとえば、DropDownListで、「列名1、列名2、列名3」という項目が選ばれたら、
    SELECT文に、「order by 列名1, 列名2,列名3」という order by句 を付加することで実現しています。
    初期値は「ソート指定なし」です(この場合、SELECT文にorder by句は付加しません)。

    >(4) 「コンボボックス」とは何ですか?(DropDownList の間違い?)
    はい、DropDownListの間違いです(つい、癖で書いてしまいました)。

    >(5) 「検索条件」と「ソート指定」を基にどのように DB から抽出するのですか?(DB のテーブルのある項目を「検索条件」として WHERE 句で絞り込み、「ソート指定」を ORDER BY 句に指定して抽出する?)
    はい、そうです。ただし、両方とも任意指定で、初期値はありません。

    >(6) 初期画面の「選択条件」と「ソート指定」どのようにして、ListView には何を表示したいのですか?(初期画面は何も表示しない?)
    はい、初期画面は何も表示したくないのです。
    現在、選択条件とソート指定で対象のデータを取得することやページングは実現できています(ListView + DataPager + OjectDataSource + Tableアダプター + ページング用の拡張メソッド)。
    今回の質問は検索条件やソート指定でどうデータを持ってくるのかを問題にしたいのではなく、初期表示のときに勝手にListViewにデータ(全件)が表示されてしまうこと(これをどう回避したらよいか)と、アップしたような Button1_Click() のイベントハンドラーで問題ないかということです。
    いろいろとごちゃごちゃと書いてしまい、問題点がかわかりにくくなってしまい申し訳ありません。

    >(7) ページングは「選択条件」と「ソート指定」と何か関係があるのですか?(なさそうに思えるのですが)
    おっしゃる通り、ページングはあまり関係がないです。ちょっと質問の仕方が悪かったです。

    2014年6月9日 7:00
  • > 初期表示のときに勝手にListViewにデータ(全件)が表示されてしまうこと(これをどう回避した
    > らよいか)と、アップしたような Button1_Click() のイベントハンドラーで問題ないかというこ
    > とです。

    そこのところだけが気になっていたということでしょうか? であれば、余計なことをいろいろ質問してすみませんでした。

    ListView1.Visible = false; に設定すれば、DB にはデータを取りに行かないので、初期表示時に無駄な選択をしていることはないと思います。

    初期表示時にデータバインド系のイベントが発生するか否かで調べられると思います。


    以下は余計なお世話かもしれませんが・・・

    ヘッダを LinkButton にして、それをクリックすることによってソートするのがよく行われている方法です。ListView でも同様なことは可能です。

    ListView でソート(行の並び替え)
    http://surferonwww.info/BlogEngine/post/2012/05/26/Sorting-on-ASPNET-ListView.aspx

    ただし、

    > OjectDataSource + Tableアダプター + ページング用の拡張メソッド

    の「ページング用の拡張メソッド」というのが、表示する部分だけ切り出すようなメソッドだとするとうまく行きませんが。

    • 回答としてマーク Ticky4649 2014年6月9日 9:43
    2014年6月9日 8:48
  • SurferOnWwwさん

    >そこのところだけが気になっていたということでしょうか? であれば、余計なことをいろいろ質問してすみませんでした。
    いえ、こちらこそ質問の焦点がぼけてしまいました。


    >ListView1.Visible = false; に設定すれば、DB にはデータを取りに行かないので、初期表示時に無駄な選択をしていることはないと思います。
    了解です。ありがとうございました。

     
    >OjectDataSource + Tableアダプター + ページング用の拡張メソッド
    の「ページング用の拡張メソッド」というのが、表示する部分だけ切り出すようなメソッドだとするとうまく行きませんが。

    はい、まさにその通りです。
    ページングのたびに全件データ取得してしまう SqlDataSource などは、業務上耐えられません。
    ここでいっているページング用の拡張メソッドというのは
    ObjectDataSource(EnablePaging=True) の SelectMethod に指定したメソッドで、
    maximumRows、startRowIndex、検索条件、ソート指定
    などを引数として受取り、該当ページのみのデータを取得するメソッドを指しています。

    検索後にヘッダーをクリックすることでソートするという要件はなく、ソートはあくまでも検索ボタンが
    押される前(検索前)に、DropDownListにより指定するという要件だけですので問題ありません。

    いろいろとご教示いただきありがとうございました。

     

    2014年6月9日 9:43