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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ASP.NET

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

VB.NET

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

Q&A

解決済

2回答

5865閲覧

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

FinalCode

総合スコア8

ASP.NET

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

VB.NET

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

0グッド

0クリップ

投稿2018/04/11 02:03

編集2018/04/13 00:12

環境

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") %>

ソース

デザイン側

ASP.NET

1<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="TEST.mailgo" %> 2<asp:Content ID="Content" ContentPlaceHolderID="body" runat="server"> 3 <div style="position: absolute; width: 210px; height: 300px; top: 0px;" id="divMenu"> 4 <asp:RadioButtonList ID="RadioButtonList1" runat="server"> 5 <asp:ListItem Selected="True" Value="0">条件A</asp:ListItem> 6 <asp:ListItem Value="1">条件B</asp:ListItem> 7 </asp:RadioButtonList> 8 <asp:Button ID="Button1" runat="server" Text="検索" Height="35px" Width="86px" /> 9 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 10 <ContentTemplate> 11 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> 12 <Columns> 13 <asp:TemplateField HeaderText="ID"> 14 <EditItemTemplate> 15 <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 16 </EditItemTemplate> 17 <ItemTemplate> 18 <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label> 19 </ItemTemplate> 20 </asp:TemplateField> 21 <asp:TemplateField HeaderText="カート追加"> 22 <EditItemTemplate> 23 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 24 </EditItemTemplate> 25 <ItemTemplate> 26 <asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Eval("ID") %>' OnClick="カート追加LinkButton_Click">LinkButton</asp:LinkButton> 27 </ItemTemplate> 28 </asp:TemplateField> 29 </Columns> 30 </asp:GridView> 31 </ContentTemplate> 32 <Triggers> 33 <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click"> 34 </asp:AsyncPostBackTrigger> 35 </Triggers> 36 </asp:UpdatePanel> 37 38 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="DB接続文" 39 SelectCommand="SELECT ID FROM T_TABLE WHERE KBN = @KBN" CancelSelectOnNullParameter="False"> 40 <SelectParameters> 41 <asp:ControlParameter ControlID="RadioButtonList1" Name="ID" PropertyName="SelectedValue" /> 42 </SelectParameters> 43 </asp:SqlDataSource> 44 </div> 45</asp:Content>

コード側

VB

1Protected Sub カート追加LinkButton_Click(sender As Object, e As EventArgs) 2 '選択された行のIDのはずがRadioButton切り替え時に押下した場合は切り替えた後に検索された結果のIDに変わってしまう 3 Dim selectedID As String = CType(sender, LinkButton).CommandArgument 4 5 'DB追加処理 6End 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で更新されて表示されてしまう

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/11 04:35

今質問に提供されている情報では分かりません。ありそうなことをいろいろ想像して答えるいうレベルにも達してないと思います。想像が間違っていると混乱を招くばかりで余計に解決から遠ざかりそうなので。
退会済みユーザー

退会済みユーザー

2018/04/11 04:42

今のコードを、問題が再現できる必要最小限までどんどん削っていって(UpdatePanel なども)、質問者さんの方で問題がどのあたりにありそうか、ある程度切り分けできませんか。デバッガ等も利用してどのようなフローになっているか追いかけるのも有効だと思います。その過程で原因が見つかって自己解決できるかもしれません。見つからなくても、その必要最小限のコードを一式アップしてもらえれば、回答者の方でも問題を再現できて有用な回答が得られるかもしれません。とにかく今の質問内容ではあまりに情報不足です。
FinalCode

2018/04/11 05:20

ご指摘いただいてありがとうございます。サンプルソースコードの作成と質問内容を見直させていただきました。よろしくお願い致します。
退会済みユーザー

退会済みユーザー

2018/04/11 05:52

> 検索条件Aで検索するとGridViewにはID1,2,3の行が表示される。検索条件Bで検索するとGridViewにはID4,5,6の行が表示される。 ←そこは間違いないですか? SqlDataSource の SelectCommand を見る限りそうは見えませんが?
FinalCode

2018/04/11 06:06

はい。実環境ではSELECTの結果は間違いありません。ただし条件のラジオボタンを変更して検索ボタンを押下してないにも関わらずカートボタンを押下すると条件変更後のIDが取得されてしまいます。各々の検索に関しては問題ありません。(少なくとも実環境では)サンプルソースの不備はお詫びいたします。
退会済みユーザー

退会済みユーザー

2018/04/11 06:26

質問にアップされたコードでは RadioButtonList の SelectedValue は未選択の場合 ""、選択されている場合は "条件A" or "条件B" のいずれかになるはず。そうすると SELECT クエリの WHERE ID = @ID では抽出できないはずですが(ID は 1, 2, 3, 4, 5, 6 とのことなので)。質問にアップしたコードは実際のものと違って、実際は問題ないと言ってます?
FinalCode

2018/04/11 06:39 編集

すみません。実環境と離れておりました。Radioは常に選択されている状態です。Radioを選択するとwhereのKBNが変更されそれに属するIDが取得できる形となっております。サンプルの修正致します。
退会済みユーザー

退会済みユーザー

2018/04/11 07:33

何度もコードを変更されてはちょっとついていけません・・・が、ざっと見たところ、最初のコードと違って、動くようになっているように見えます。自分の環境で、似たようなコードで期待通り動くことは確認しました。とりあえずそのコードを回答欄にアップしておきます。
FinalCode

2018/04/11 08:14

ご回答ありがとうございます。実環境が現在手元になく空でのコードになってしまい申し訳なかったです。サンプルソースの方実行しましたが期待通りの動作を確認致しました。見比べてみます。ありがとうございます。 やや別件にはなってしまうのですが貼っていただいたサンプルソースでもですがGridView内のLinkButtonを押下すると再検索が動いてしまうのは何故でしょうか・・。またLinkButtonを押下しても検索が行われない様回避する方法はございますでしょうか。
退会済みユーザー

退会済みユーザー

2018/04/11 08:17

「再検索が動いてしまう」というのはどういうことですか? 何を見て、どうなったから、動いてしまうと判断したのか具体的に書いてください。
退会済みユーザー

退会済みユーザー

2018/04/11 08:19

回答に対するコメントはここではなく、回答欄の下のコメント欄にお願いします。
FinalCode

2018/04/12 01:54

現状SqlDataSourceのSelectingEventで検索ボタンだったら処理を続けてそれ以外だったら処理中止的なのが書けたら突破できそうなのですが思いつかず唸っております。
退会済みユーザー

退会済みユーザー

2018/04/12 08:00

上のコメント今気が付きました。「回答に対するコメントはここではなく、回答欄の下のコメント欄にお願いします」とお願いしたのですが・・・
FinalCode

2018/04/12 08:05

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

退会済みユーザー

2018/04/12 08:09

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

2018/04/12 08:11

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

回答2

0

ベストアンサー

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 07:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FinalCode

2018/04/11 08:25

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

退会済みユーザー

2018/04/11 10:16 編集

それは今のやり方ではどうしようもないです。LinkButton をクリックすると非同期ポストバックがかかり、その応答で UpdatePanel 内は再描画されますが、サーバー側では RadioButtonList の選択が変更されていることを感知しますので、変更後の条件で SQL Server にクエリを投げてデータを取得し、それで GridView を再描画します。 それは気に入らないということであれば、そういうことが起こらない対策をコーディングするということになります。
退会済みユーザー

退会済みユーザー

2018/04/11 10:34 編集

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

2018/04/12 01:35

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

退会済みユーザー

2018/04/12 05:30

RadioButtonList の選択結果を直ちに GridView に反映できるように AutoPostBack を true にする(検索ボタンは使わない)、非同期ポストバックで処理したいのなら RadioButtonList を UpdatePanel の中に入れるようにしては? それができない質問者さん独自の理由・事情があるのですか? もしそうなら、それをきちんと書いてください。このスレッドの質問に書いてあること以外は知り得ない第三者に分かるように。
FinalCode

2018/04/12 08:10

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

2018/04/12 08:19

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

2018/04/12 08:44

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

退会済みユーザー

2018/04/12 09:35 編集

> 実際の画面と操作も可能な限り張らせて頂きましたので、宜しくお願い致します。 そういうのは止めましょうよ。最初の質問からどんどん変わってきていてフォローしきれません。ただでさえ、最初の動かないコードから変わっているのに・・・ 私が私の回答にアップたコードをベースにした話に戻しませんか? そうできないなら、とてもこの先お付き合いできません。
FinalCode

2018/04/13 00:00

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

2018/04/13 00:16

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

退会済みユーザー

2018/04/13 01: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 イベントでなんちゃらというような簡単なことではできないと思います。好ましからざる副作用もありそうで、自分としては決してお勧めではありません)
FinalCode

2018/04/13 01:37

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

2018/04/13 02:32

SurferOnWww様 解決方法はご提案して頂いた方法とは違うのですが解決致しました。 SelectParametersの種類をControlParameterからParameterに変更し、検索ボタンを押下時にParameterにRadioButtonList1の選択値をセットするという方法で検索ボタン押下時のみGridViewの更新を行う様に変更致しました。 色々こちらの不手際があったにも関わらずお付き合い頂きありがとうございました。
退会済みユーザー

退会済みユーザー

2018/04/13 03:17

> SelectParametersの種類をControlParameterからParameterに変更し、検索ボタンを押下時にParameterにRadioButtonList1の選択値をセットする Button.Click のイベントハンドラで Parameter.DefultValue を書き換えるという方法でしょうか? なるほどそれが一番スマートな方法のようですね。気が付きませんでした。
guest

0

デザイン側

ASP.NET

1<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="test.aspx.vb" Inherits="TEST.mailgo" %> 2<asp:Content ID="Content" ContentPlaceHolderID="body" runat="server"> 3 <div style="position: absolute; width: 210px; height: 300px; top: 0px;" id="divMenu"> 4 <asp:RadioButtonList ID="RadioButtonList1" runat="server"> 5 <asp:ListItem Selected="True" Value="0">条件A</asp:ListItem> 6 <asp:ListItem Value="1">条件B</asp:ListItem> 7 </asp:RadioButtonList> 8 <asp:Button ID="btnSearch" runat="server" Text="検索" Height="35px" Width="86px" /> 9 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 10 <ContentTemplate> 11 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> 12 <Columns> 13 <asp:TemplateField HeaderText="ID"> 14 <EditItemTemplate> 15 <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 16 </EditItemTemplate> 17 <ItemTemplate> 18 <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label> 19 </ItemTemplate> 20 </asp:TemplateField> 21 <asp:TemplateField HeaderText="カート追加"> 22 <EditItemTemplate> 23 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 24 </EditItemTemplate> 25 <ItemTemplate> 26 <asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Eval("ID") %>' OnClick="カート追加LinkButton_Click">LinkButton</asp:LinkButton> 27 </ItemTemplate> 28 </asp:TemplateField> 29 </Columns> 30 </asp:GridView> 31 </ContentTemplate> 32 <Triggers> 33 <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click"> 34 </asp:AsyncPostBackTrigger> 35 </Triggers> 36 </asp:UpdatePanel> 37 38 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="DB接続文" 39 SelectCommand="SELECT ID FROM T_TABLE WHERE KBN = @KBN" CancelSelectOnNullParameter="False"> 40 <SelectParameters> 41 <asp:Parameter Name="ID" Type="String" /> 42 </SelectParameters> 43 </asp:SqlDataSource> 44 </div> 45</asp:Content>

コード側

VB.NET

1Protected Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click 2 '条件設定 3 SqlDataSource1.SelectParameters(0).DefaultValue = RadioButtonList1.SelectedValue 4 5 'DB検索処理 6End Sub 7 8Protected Sub カート追加LinkButton_Click(sender As Object, e As EventArgs) 9 '選択ID 10 Dim selectedID As String = CType(sender, LinkButton).CommandArgument 11 12 'DB追加処理 13End Sub

投稿2018/04/13 02:41

FinalCode

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問