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

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

ただいまの
回答率

90.47%

  • VB.NET

    942questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    545questions

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

意図せず内部的にGridViewが更新されてしまう

解決済

回答 2

投稿 編集

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

FinalCode

score 2

環境

ASP.NET
WebForms
VB.NET
VisualStudio2017

画面構成

検索条件用 RadioButton
検索 Button
検索結果表示用 GridView

GridView用 UpdatePanel
GridView用 SqlDataSource

GridViewの中の要素として
検索結果ID Label
カート追加用 LinkButton

イメージ説明

設定

UpdatePanelはUpdateModeがConditionalでtriggerはAsyncPostBack:検索Button.Click
GridView内カート追加用LinkButtonのCommandArgumentに<%# Eval("ID") %>

ソース

デザイン側

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="TEST.mailgo" %>
<asp:Content ID="Content" ContentPlaceHolderID="body" runat="server">
    <div style="position: absolute; width: 210px; height: 300px; top: 0px;" id="divMenu">
        <asp:RadioButtonList ID="RadioButtonList1" runat="server">
            <asp:ListItem Selected="True" Value="0">条件A</asp:ListItem>
            <asp:ListItem Value="1">条件B</asp:ListItem>
        </asp:RadioButtonList>
        <asp:Button ID="Button1" runat="server" Text="検索" Height="35px" Width="86px" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField HeaderText="ID">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="カート追加">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Eval("ID") %>' OnClick="カート追加LinkButton_Click">LinkButton</asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click">
                </asp:AsyncPostBackTrigger>
            </Triggers>
        </asp:UpdatePanel>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="DB接続文" 
                            SelectCommand="SELECT ID FROM T_TABLE WHERE KBN = @KBN" CancelSelectOnNullParameter="False">
            <SelectParameters>
                <asp:ControlParameter ControlID="RadioButtonList1" Name="ID" PropertyName="SelectedValue" />
            </SelectParameters>
        </asp:SqlDataSource>
    </div>
</asp:Content>


コード側

Protected Sub カート追加LinkButton_Click(sender As Object, e As EventArgs)
        '選択された行のIDのはずがRadioButton切り替え時に押下した場合は切り替えた後に検索された結果のIDに変わってしまう
        Dim selectedID As String = CType(sender, LinkButton).CommandArgument

        'DB追加処理
End Sub

問題と期待動作

用意されているデータ
ID,KBN
1,0
2,0
3,0
4,1
5,1
6,1

検索条件Aで検索するとGridViewにはID1,2,3の行が表示される。
検索条件Bで検索するとGridViewにはID4,5,6の行が表示される。

  1. 検索条件用 RadioButtonを条件Aに設定する。
  2. 検索ボタンを押下する
  3. 検索条件用 RadioButtonを条件Bに設定する。
  4. GridView内のID2の行のカート追加用 LinkButtonを押下する

期待:ID2が取得できる。
現象:ID5が取得される。

3の時にPostBackが発生してない・画面の更新がされていないにも関わらず、4のLinkButton.Clickで取得できるIDが3で検索した時に取れるIDになってしまいます。
RadioButtonのAutoPostBackも切っている・UpdatePanelのtriggerも検索ボタンに設定しているのに何故検索条件Bでとれた場合のIDが取得されてしまうのでしょうか

GridView内のLinkButtonで再検索を行わない様にしたいのですがどの様にすればよろしいでしょうか。
御教授お願いいたします。

頂いたコードでの結果

イメージ説明
画面表示後に条件Aでの検索を行った状態
①条件Bを選択する
②カート追加ボタンを押下する
イメージ説明
正しく条件AでのValueが取得できるがGridViewが条件Bで更新されて表示されてしまう

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • FinalCode

    2018/04/12 17:05

    いえ、こちらは閲覧者していただいた方全体に対する補足として書きました。すみません。

    キャンセル

  • SurferOnWww

    2018/04/12 17:09

    では、私からの回答はもう不要と言うことでいいのですね?

    キャンセル

  • FinalCode

    2018/04/12 17:11

    SurferOnWwwさんへの補足以外への事をここに書くのかなと思いこちらに書いておりました。すみません。

    キャンセル

回答 2

checkベストアンサー

+1

2018/04/11 16:33 の私のコメントで、「とりあえずそのコードを回答欄にアップしておきます」と書きましたが、それを以下に書きます。

このコードで期待通り動きます。LinkButton クリックで正しく ID が表示されます。

DB は Microsoft のサンプルデータベースの Northwind の Products テーブルを使いました。SELECT クエリの WHERE 句で奇数・偶数 ID 切り替えて抽出するようにしているところが質問者さんのものとは違いますが、他はほぼ同じです。

質問者さんのコードが動かない理由は謎ですが、質問には書いてない何かがあるのではと想像してます。見比べてみてください。

0031-GridViewRadioButtonList.aspx.cs

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

public partial class _0031_GridViewRadioButtonList : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        Label3.Text = "SelectedValue is " + ((LinkButton)sender).CommandArgument;
    }
}

0031-GridViewRadioButtonList.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="0031-GridViewRadioButtonList.aspx.cs" 
    Inherits="_0031_GridViewRadioButtonList" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <asp:RadioButtonList ID="RadioButtonList1" runat="server">
            <asp:ListItem Value="1" Selected="True">条件A</asp:ListItem>
            <asp:ListItem Value="0">条件B</asp:ListItem>
        </asp:RadioButtonList>       

        <asp:Button ID="Button1" runat="server" Text="Button" />

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NORTHWINDConnectionString %>" 
            SelectCommand="SELECT TOP 10 [ProductID], [ProductName] FROM [Products] 
                           WHERE ([ProductID] % 2 = @oddeven) ORDER BY [ProductID]">
            <SelectParameters>
                <asp:ControlParameter ControlID="RadioButtonList1" 
                    Name="oddeven" PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>                
                <asp:GridView ID="GridView1" runat="server" 
                    AutoGenerateColumns="False" DataKeyNames="ProductID" 
                    DataSourceID="SqlDataSource1">
                    <Columns>
                        <asp:TemplateField HeaderText="ProductID" 
                            InsertVisible="False" SortExpression="ProductID">
                            <ItemTemplate>
                                <asp:Label ID="Label1" runat="server" 
                                    Text='<%# Bind("ProductID") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="ProductName" 
                            SortExpression="ProductName">
                            <ItemTemplate>
                                <asp:Label ID="Label2" runat="server" 
                                    Text='<%# Bind("ProductName") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="カート追加">
                            <ItemTemplate>
                                <asp:LinkButton ID="LinkButton1" runat="server" 
                                    CommandArgument='<%# Eval("ProductID") %>' 
                                    OnClick="LinkButton1_Click">
                                    LinkButton
                                </asp:LinkButton>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
                <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
    </form>
</body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/11 17:25

    上記テストコードのRadioButtonList1の条件Aを選択し、Button1を押下すると条件Aの結果がGridに現れます。
    その後RadioButtonList1の条件Bを選択し、Gridに現れているLinkButton1を押下すると期待通り条件Aで表示されていたProductIDがLabel3に表示されますが、GridViewが再描画され条件Bの結果がGridに表示されてしまいます。
    こちらをLinkButton1を押下しても再検索を行われない様にする事は可能でしょうか。

    キャンセル

  • 2018/04/11 19:12 編集

    それは今のやり方ではどうしようもないです。LinkButton をクリックすると非同期ポストバックがかかり、その応答で UpdatePanel 内は再描画されますが、サーバー側では RadioButtonList の選択が変更されていることを感知しますので、変更後の条件で SQL Server にクエリを投げてデータを取得し、それで GridView を再描画します。

    それは気に入らないということであれば、そういうことが起こらない対策をコーディングするということになります。

    キャンセル

  • 2018/04/11 19:33 編集

    よく読み直してみると、上のコメントの話が問題だったようですね。最初の質問の動かないコードを見て、動かないことが問題だと思ってました。外したレスだったようで、すみません。

    キャンセル

  • 2018/04/12 10:35

    Grid内のLinkButtonを押下しても再検索が行われなければ想定どおりとなるはずだとは思います。
    ただその方法が思いつかずこの様な分かりづらい質問になってしまい申し訳ございません。
    御教授頂けるとありがたいです。

    キャンセル

  • 2018/04/12 14:30

    RadioButtonList の選択結果を直ちに GridView に反映できるように AutoPostBack を true にする(検索ボタンは使わない)、非同期ポストバックで処理したいのなら RadioButtonList を UpdatePanel の中に入れるようにしては?

    それができない質問者さん独自の理由・事情があるのですか? もしそうなら、それをきちんと書いてください。このスレッドの質問に書いてあること以外は知り得ない第三者に分かるように。

    キャンセル

  • 2018/04/12 17:10

    検索条件をGridViewに即時反映したいのではなく、検索ボタンを押した時のみ非同期ポストバックでGridViewへの更新を行いたいと思っております。
    ですので、提示していただいたサンプルソースの場合、GridView内のLinkButtonを押すことにより検索が行われることが問題となっております。

    キャンセル

  • 2018/04/12 17:19

    サンプルですとうまく伝える事が難しいですので実際の画面と操作も可能な限り張らせて頂きます。

    キャンセル

  • 2018/04/12 17:44

    実際の画面と操作も可能な限り張らせて頂きましたので、宜しくお願い致します。

    キャンセル

  • 2018/04/12 18:33 編集

    > 実際の画面と操作も可能な限り張らせて頂きましたので、宜しくお願い致します。

    そういうのは止めましょうよ。最初の質問からどんどん変わってきていてフォローしきれません。ただでさえ、最初の動かないコードから変わっているのに・・・ 私が私の回答にアップたコードをベースにした話に戻しませんか? そうできないなら、とてもこの先お付き合いできません。

    キャンセル

  • 2018/04/13 09:00

    了解致しました。
    頂いたサンプルソースですと、上記に書かせて頂いている通り検索条件をGridViewに即時反映したいのではなく、検索ボタンを押した時のみ非同期ポストバックでGridViewへの更新を行いたいと思っております。
    ですので、提示していただいたサンプルソースの場合、GridView内のLinkButtonを押すことにより検索が行われることが問題となっております。

    キャンセル

  • 2018/04/13 09:16

    サンプルソースでの画面操作、問題点を追記させて頂きました。
    SqlDataSauceのSelectingイベントあたりで検索ボタンだったら更新する..というifで回避できるのかなという感じではあるのですが実現できない状態です。
    よろしくお願いいたします。

    キャンセル

  • 2018/04/13 10:20

    > サンプルソースでの画面操作、問題点を追記させて頂きました。

    「問題点」の理由は上の 2018/04/11 19:16 の私のコメントに書いた通りですが、それは理解してますか?

    解決策は 2018/04/12 14:30 の私のコメントに書きましたがそれが NG とすると、あと思いつくのは以下の 3 つです。

    (1) LinkButton クリックでポストバックしないで(LinkButton ではなく input type="button" のような submit しないボタンを使って)、クライアントスクリプトでクリックイベントを拾って jQuery ajax でサーバーに必要なデータを送信する。

    (2) どうしても LinkButton クリックでポストバックする必要があるなら、GirdView の DataSourceID="SqlDataSource1" は削除して、[Button]のクリックのイベントのみで GridView を再描画するようコーディングする。

    (3) GirdView の DataSourceID="SqlDataSource1" は削除しないで、何らかの小細工・裏技を考える。

    可能であれば (1) がお勧めです。(2) は SqlDataSource の機能を利用してのソート、更新、削除、ページングが不要ならばという条件付きです。(3) は (1), (2)が NG なら考えざるを得ないと思いますが可能かどうかは不明です(Sorting イベントでなんちゃらというような簡単なことではできないと思います。好ましからざる副作用もありそうで、自分としては決してお勧めではありません)

    キャンセル

  • 2018/04/13 10:37

    回答ありがとうございます。
    ご指摘の問題点は理解しております。
    以前提示していただいた解決策はRadioButtonListを変更された時点でGridViewに反映するとの事でしたがRadioButtonListを変更した時点では検索を行いたくない為解決できませんでした。
    今回提示して頂いた1の方法で少し考えてみます。
    2の方法はソート等行っている為なるべく避けたいとは考えておりますが1で解決できなかった場合ソート等を独自実装という形で考えてみたいと思います。
    少しお時間頂きますのでとりあえず返事だけとなります。

    キャンセル

  • 2018/04/13 11:32

    SurferOnWww様
    解決方法はご提案して頂いた方法とは違うのですが解決致しました。

    SelectParametersの種類をControlParameterからParameterに変更し、検索ボタンを押下時にParameterにRadioButtonList1の選択値をセットするという方法で検索ボタン押下時のみGridViewの更新を行う様に変更致しました。

    色々こちらの不手際があったにも関わらずお付き合い頂きありがとうございました。

    キャンセル

  • 2018/04/13 12:17

    > SelectParametersの種類をControlParameterからParameterに変更し、検索ボタンを押下時にParameterにRadioButtonList1の選択値をセットする

    Button.Click のイベントハンドラで Parameter.DefultValue を書き換えるという方法でしょうか? なるほどそれが一番スマートな方法のようですね。気が付きませんでした。

    キャンセル

0

デザイン側

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="TEST.mailgo" %>
<asp:Content ID="Content" ContentPlaceHolderID="body" runat="server">
    <div style="position: absolute; width: 210px; height: 300px; top: 0px;" id="divMenu">
        <asp:RadioButtonList ID="RadioButtonList1" runat="server">
            <asp:ListItem Selected="True" Value="0">条件A</asp:ListItem>
            <asp:ListItem Value="1">条件B</asp:ListItem>
        </asp:RadioButtonList>
        <asp:Button ID="btnSearch" runat="server" Text="検索" Height="35px" Width="86px" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField HeaderText="ID">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="カート追加">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Eval("ID") %>' OnClick="カート追加LinkButton_Click">LinkButton</asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click">
                </asp:AsyncPostBackTrigger>
            </Triggers>
        </asp:UpdatePanel>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="DB接続文" 
                            SelectCommand="SELECT ID FROM T_TABLE WHERE KBN = @KBN" CancelSelectOnNullParameter="False">
            <SelectParameters>
                <asp:Parameter Name="ID" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
    </div>
</asp:Content>

コード側

Protected Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
        '条件設定
        SqlDataSource1.SelectParameters(0).DefaultValue = RadioButtonList1.SelectedValue

        'DB検索処理
End Sub

Protected Sub カート追加LinkButton_Click(sender As Object, e As EventArgs)
        '選択ID
        Dim selectedID As String = CType(sender, LinkButton).CommandArgument

        'DB追加処理
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

関連した質問

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

  • VB.NET

    942questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    545questions

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