none
GridViewで絞込したあとに編集 RRS feed

  • 質問

  • visual web developer 2010 Expressを使用してWeb アプリケーションプロジェクトを作成しています。
    環境は以下です。
    WEBサーバ:Windows Server 2008 R2 Standard
    IISのバージョン:Version7.5.7600.16385

    .NET のバージョン:Microsoft .NET Framework 4
    使用ブラウザ:IE,Firefox,Chrome(すべて最新バージョン)
    使用言語:VB

    GridViewの下に
    テキストボックス(txtSerch)とボタンを配置し,
    テキストボックスに検索したい用語を入れてボタンをクリックすると,
    絞込の結果がGridViewに反映されるようにしています。

    GridViewの各レコードの先頭に「編集」ボタンを配置して,
    内容を編集できるようにしています。

    GridViewが全件表示されているときは編集ボタンが使えているのですが,
    絞込検索したときに編集ボタンをクリックすると,
    絞込が解除されてしまい,まったく別のレコードが編集モードになってしまいます。

    例)全件表示したとき上から10番目,絞込すると上から3番目にくるレコードを編集したくて,
    絞込した後,上から3番目の「編集」をクリックすると,【全件表示したときの】上から3番目のレコードが
    編集モードになってしまう。

    この場合,どこを修正すればいいのでしょうか?

    ↓絞込ボタンクリック時のコード以下です↓
    「×××」というテーブルから,「Name」「Method」フィールドで部分一致するレコードを抽出しています。

            If (Me.txtSerch.Text <> "") Then
                'txtSerchが空以外ならば、条件検索を行う。
                Me.SqlDataSource3.SelectCommand = "SELECT [ID], [Name], [Method], ・・・ FROM [×××] WHERE [Name] LIKE '%' + @Name + '%' or [Method] LIKE '%' + @Method + '%' or ・・・ ORDER BY [ID] DESC"
                'パラメータをクリア
                Me.SqlDataSource3.SelectParameters.Clear()

                'パラメータをセット
                Me.SqlDataSource3.SelectParameters.Add("Name", Me.txtSerch.Text)
                Me.SqlDataSource3.SelectParameters.Add("Method", Me.txtSerch.Text)
            Else
                'txtSerchが空ならば、全件検索
                Me.SqlDataSource3.SelectCommand = "SELECT [ID], [Name], [Method],・・・ FROM [×××] ORDER BY [ID] DESC"
            End If
    2017年10月26日 8:02

回答

  • 【追伸】

    全件抽出と絞り込みで SELECT クエリを差し替えているようですが、SELECT クエリは固定してパラメータで切り替えるという方法を取ることをお勧めします。

    その方が、ASP.NET Web Forms アプリのサーバーコントロールが持つ機能を有効に利用でき、簡単かつスマートだと思います。

    一例を書くと、

    (1) GridView + SqlDataSource を用い GridView.DataSourceID に SqlDataSource の ID を設定。GridView の ViewSate は有効(デフォルト)にしておく。

    そうすれば、必要に応じて SQL Server からのデータの取得とバインドは自動的に SqlDataSource が行ってくれます。必要がなければ ViewState からデータを取得するようになります。・・・すべて自動的に行ってくれるというところが重要。自分でコードを書いてコントロールしようなどとは考えない方が良いと思います。

    (2) SELECT クエリの WHERE 句を以下のように、全件抽出と絞り込みに共通で使うようにします。

    SELECT ... WHERE (@Name = 'ALL') OR ([Name] LIKE '%' + @Name + '%')

    (3) SqlDataSource の SelectParameters の取得先に TextBox コントロールを指定します。以下のような感じ。

    <SelectParameters>
        <asp:ControlParameter ControlID="TextBox1" Name="Name" 
            PropertyName="Text" Type="String" />
    </SelectParameters>

    ここが上記 (1) に書いた「すべて自動的に行ってくれる」ことのために重要。ポストバック前後で Text プロパティの内容が変わっている場合に限り自動的に SQL Server からデータを取得し GridView にバインドしてくれるようになります。反対に、Text プロパティに変わりがなければ ViewState からデータを取得し表示します。

    (4) TextBox の Text プロパティには初期値として "ALL" を設定しておく。以下のような感じ。

    <asp:TextBox ID="TextBox1" runat="server" Text="ALL">
    </asp:TextBox>

    これで初期画面では全件抽出の結果が表示されます。それ以降でも、テキストボックスに "ALL" と入力すれば全件抽出、それ以外の文字列の場合はそれで絞り込んだ結果が表示されます。

    (5) どうしてもテキストボックス入力で空白も全件抽出の条件にしたいなら、SqlDataSource.Selecting イベントのハンドラで空白だったらパラメータに "ALL" を代入する。以下のような感じ。

    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        if (String.IsNullOrEmpty(TextBox1.Text))
        {
            e.Command.Parameters["@Name"].Value = "ALL";
        }
    }

    ・・・以上、検討してみてください。たぶん、質問者さんのやり方より簡単かつスマートで、開発工数も保守工数も少なくて済むと思います。


    2017年10月27日 3:40

すべての返信

  • 質問には、データソースコントロールが何かとか、パラメータの設定がどうなっているかなど重要な情報が何もないです。

    デバッグしてみましたか? 例えば、アップされているコードの if 文にブレークポイントを設定して、どういう流れになるか追ってみましたか?

    > 絞込検索したときに編集ボタンをクリックすると,
    > 絞込が解除されてしまい,まったく別のレコードが編集モードになってしまいます。

    ということから、編集ボタンクリックでポストバックされ、else 側の処置に飛ぶのではないかと想像していますが、そうだとすると、その原因は何かを考えてみましたか?

    考えてみたけどお手上げということであれば、Northwind とか AdvnetureWorks など、回答者も普通に持っているサンプルデータベースを使って、回答者が質問者さんの問題を再現できるごくごく簡単な必要最低限のサンプルを作って、それをここにアップすることをお勧めします。


    • 編集済み SurferOnWww 2017年10月26日 14:07 訂正
    2017年10月26日 14:06
  • 【追伸】

    全件抽出と絞り込みで SELECT クエリを差し替えているようですが、SELECT クエリは固定してパラメータで切り替えるという方法を取ることをお勧めします。

    その方が、ASP.NET Web Forms アプリのサーバーコントロールが持つ機能を有効に利用でき、簡単かつスマートだと思います。

    一例を書くと、

    (1) GridView + SqlDataSource を用い GridView.DataSourceID に SqlDataSource の ID を設定。GridView の ViewSate は有効(デフォルト)にしておく。

    そうすれば、必要に応じて SQL Server からのデータの取得とバインドは自動的に SqlDataSource が行ってくれます。必要がなければ ViewState からデータを取得するようになります。・・・すべて自動的に行ってくれるというところが重要。自分でコードを書いてコントロールしようなどとは考えない方が良いと思います。

    (2) SELECT クエリの WHERE 句を以下のように、全件抽出と絞り込みに共通で使うようにします。

    SELECT ... WHERE (@Name = 'ALL') OR ([Name] LIKE '%' + @Name + '%')

    (3) SqlDataSource の SelectParameters の取得先に TextBox コントロールを指定します。以下のような感じ。

    <SelectParameters>
        <asp:ControlParameter ControlID="TextBox1" Name="Name" 
            PropertyName="Text" Type="String" />
    </SelectParameters>

    ここが上記 (1) に書いた「すべて自動的に行ってくれる」ことのために重要。ポストバック前後で Text プロパティの内容が変わっている場合に限り自動的に SQL Server からデータを取得し GridView にバインドしてくれるようになります。反対に、Text プロパティに変わりがなければ ViewState からデータを取得し表示します。

    (4) TextBox の Text プロパティには初期値として "ALL" を設定しておく。以下のような感じ。

    <asp:TextBox ID="TextBox1" runat="server" Text="ALL">
    </asp:TextBox>

    これで初期画面では全件抽出の結果が表示されます。それ以降でも、テキストボックスに "ALL" と入力すれば全件抽出、それ以外の文字列の場合はそれで絞り込んだ結果が表示されます。

    (5) どうしてもテキストボックス入力で空白も全件抽出の条件にしたいなら、SqlDataSource.Selecting イベントのハンドラで空白だったらパラメータに "ALL" を代入する。以下のような感じ。

    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        if (String.IsNullOrEmpty(TextBox1.Text))
        {
            e.Command.Parameters["@Name"].Value = "ALL";
        }
    }

    ・・・以上、検討してみてください。たぶん、質問者さんのやり方より簡単かつスマートで、開発工数も保守工数も少なくて済むと思います。


    2017年10月27日 3:40
  • いつもありがとうございます!!

    >データソースコントロールが何かとか、パラメータの設定がどうなっているかなど重要な情報が何もない
    大変失礼しました。

    コードを使わず,「Gridviewタスク」から「編集を有効にする」にチェックを入れて
    なんとなく作ってしまっていたので,
    質問が曖昧になってしまって申し訳ありませんでした。

    いただいた方法に直してやってみます!
    また結果ご連絡させていただきます。

    ありがとうございます!
    2017年10月27日 7:38
  • masu-nona さん、こんにちは
    フォーラム オペレーターの立花楓です。

    本件について、問題は解消されましたでしょうか。

    SurferOnWww さんから寄せられた方法で実装されていると思いますが、なにか進展がございましたらご返信いただけますと幸いです。

    また、お寄せいただいた情報が参考になった場合には [回答としてマーク] をお願いいたします。
    同様の課題を持ったユーザーが当スレッドを閲覧した際に、一見して参考となる情報がわかると大変助けになると思いますので、お手数ですがよろしくお願いいたします。


    MSDN/TechNet Community Support 立花楓

    2017年11月14日 2:44
    モデレータ
  • >立花楓 さま
    >SurferOnWww さま

    ご連絡が遅くなってしまっていて大変申し訳ありません。
    いただいた方法で一度やってみたのですがうまくいかず,悩んでいる最中です。
    別の仕事が始まってしまいそれ以来手をつけられていないのですが,
    また近々挑戦します。

    失礼をしてしまい申し訳ありません。
    2018年2月16日 6:15