トップ回答者
ListViewで更新されない

質問
-
DropDownListのOnSelectedIndexChangedで、ListViewに表示する内容を変えたく
下記のようにしているのですが、drp_tanto.SelectedValue == ""の時は
きちんとデータが表示されるのですが、値が入っているのを選択すると
「データは返されませんでした。」となってしまいます。
SQL自体は問題なく、正常に取得できていることは確認致しました。
ですが、OnItemDataBoundイベントにも入ってきていません。
また、いろいろと検索してみて、接続文字列に Allow User Variables=Trueを
加えてみたのですが、System.Data.Dllでエラーとなり、
KeyWord not supportedとなってしまいます。
private void drp_chanege_handler(){ string sql = ""; sql = "SELECT m.item as item,m.lot as lot"; sql += ",m.itemgroup as itemgroup"; sql += ",m.user_id as user_id"; sql += ",m.login_name as login_name"; sql += ",m.updateday as updateday"; sql += ",m.createday as createday"; sql += ",m.sort_id as sort_id"; sql += ",(CASE WHEN t.price1 is NULL THEN 0 ELSE t.price1 END) as price1"; sql += ",(CASE WHEN t.price2 is NULL THEN 0 ELSE t.price2 END) as price2"; if (drp_tanto.SelectedValue == "") { sql += " FROM (SELECT * FROM m_syouhin ) m LEFT JOIN "; sql += " (SELECT * FROM tbl_priceset where setday='" + prv_date.ToString("yyyy/MM/dd") + "') t "; } else { sql += " FROM (SELECT * FROM m_syouhin where login_name='" + drp_tanto.SelectedValue + "' ) m LEFT JOIN "; sql += " (SELECT * FROM tbl_priceset where setday='" + prv_date.ToString("yyyy/MM/dd") + "') t "; } sql += " ON m.item=t.item and m.lot=t.lot order by m.sort_id,m.item,m.lot"; MySqlDataSource.SelectCommand = sql; }
<label>担当名</label> <asp:DropDownList ID="drp_tanto" runat="server" AutoPostBack="True" OnSelectedIndexChanged="drp_tanto_SelectedIndexChanged" class="form-control"></asp:DropDownList> <asp:ListView ID="_listView" runat="server" DataSourceID="MySqlDataSource" DataKeyNames="item,lot" OnItemDataBound="_listView_ItemDataBound" OnLayoutCreated="_listView_LayoutCreated"> <EmptyDataTemplate> <table id="Table1" runat="server" style=""> <tr> <td>データは返されませんでした。</td> </tr> </table> </EmptyDataTemplate> <ItemTemplate> <tr> <td class="c1"> <a href="#" data-toggle="modal" data-target="#basicModal" class="btn btn-success">行挿入</a> </td> <td class="c2"> <asp:Label Text='<%# Eval("sort_id") %>' runat="server" ID="sortLabel" /> </td> <td class="c3"> <asp:Label Text='<%# Eval("item") %>' runat="server" ID="itemLabel" /> </td> <td class="c4"> <asp:Label Text='<%# Eval("lot") %>' runat="server" ID="lotLabel" /> </td> </tr> </ItemTemplate> <LayoutTemplate> <table border="0" class="table table-bordered table-hover table-striped table-hgroup overflow-y"> <thead class="scrollHead"> <tr runat="server" style=""> <th runat="server"></th> <th runat="server"></th> <th runat="server"></th> <th runat="server"></th> </tr> <tr runat="server" style=""> <th runat="server" class="c1"></th> <th runat="server" class="c2">表示順</th> <th runat="server" class="c3">商品</th> <th runat="server" class="c4">規格</th> </tr> </thead> <tbody class="scrollBody"> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </tbody> </table> </LayoutTemplate> <SelectedItemTemplate> <tr> <td class="c1"> <a href="#" data-toggle="modal" data-target="#basicModal" class="btn btn-lg btn-success">行挿入</a> </td> <td class="c2"> <asp:Label Text='<%# Eval("sort_id") %>' runat="server" ID="sortLabel" /> </td> <td class="c3"> <asp:Label Text='<%# Eval("item") %>' runat="server" ID="itemLabel" /> </td> <td class="c4"> <asp:Label Text='<%# Eval("lot") %>' runat="server" ID="lotLabel" /> </td> </tr> </SelectedItemTemplate> </asp:ListView> <asp:SqlDataSource ID="MySqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:MySqlDataSorce %>" ProviderName="<%$ ConnectionStrings:MySqlDataSorce.ProviderName %>" SelectCommand="SELECT m.item as item,m.lot as lot,m.itemgroup as itemgroup,m.user_id as user_id,m.login_name as login_name,m.updateday as updateday,m.createday as createday,t.price1 as price1,t.price2 as price2,m.sort_id as sort_id FROM m_syouhin m ,tbl_priceset t where m.item=t.item and m.lot=t.lot order by m.sort_id,m.item,m.lot" InsertCommand="INSERT into m_syouhin (item, lot,itemgroup,user_id,login_name,updateday,createday,sort_id ) values (@item,@lot,@itemgroup,@user_id,@login_name,@updateday,@createday,@sort_id )" OnInserting="MySqlDataSource_Inserting"></asp:SqlDataSource>
開発用PC
Windows8 Pro、VsiaulStudio Commity2013 (ASP.net C#)
ASP.NET開発サーバ、IIS8、Framework4.5
MySQL Server 5.6、MySQL Connector Net 6.6.5
-------------------------------------------------------------------
回答
-
開発環境では NG で、運用環境では OK ということでしょうか?
逆だと原因究明は難しいものがあるかもしれませんが、開発環境で問題を再現できるのだからいくらでも調べようがあります。
> SQL自体はMySqlDataSource.SelectCommandをウォッチし、
> テキストビジュアライザーで中のSQLコマンドを確認致しました。
> このSQLをPHPAdminなどで発行すると正常に取得できております。「このSQLをPHPAdminなどで発行」とはどういうことですか? PHPAdmin というのは何だか知りませんが、クエリを直接、運用環境の(もしくは開発マシンの?)MySQL に投げたということですか?
SqlDataSource が一レコードも取得できてないから ListView の EmptyDataTemplate が表示されるということですよね。であれば、そんなことをするのではなく、SqlDataSource がレコードを取得して DataSet(デフォルト)を作っているかを調べることになるのでは?
一番疑わしいのがクエリだと思ったのですが、問題が発生する時のクエリを調べて、そのクエリ自体は大丈夫そうだと言うことがわかったのですよね。
であれば、次はその問題が発生するときのクエリで(即ち、DropDownList を問題が出るように選択して)SqlDataSource が期待通りレコードを取得できているか調べてみてください。
やり方は、(1) SqlDataSource.Selected イベントのハンドラの引数 SqlDataSourceStatusEventArgs オブジェクトの AffectedRows プロパティを調べるとか、(2) SqlDataSource.Select メソッドで DataView を取得してみるなど、開発環境なのでなんでも自由にできるはずです。
- 編集済み SurferOnWww 2015年4月6日 6:50 一部修正
- 回答としてマーク hys73 2015年4月9日 10:54
すべての返信
-
> 下記のようにしているのですが、drp_tanto.SelectedValue == ""の時は
> きちんとデータが表示されるのですが、値が入っているのを選択すると
> 「データは返されませんでした。」となってしまいます。それは EmptyDataTemplate が表示されているということですが、ということは「値が入っている」ときはレコードが一つも抽出されてないということを意味します。
クエリの中の where login_name='" + drp_tanto.SelectedValue + "' で、その条件に合うレコードがないということが原因としてあやしいです。
> SQL自体は問題なく、正常に取得できていることは確認致しました。
というのが上記と矛盾しますが、それは具体的にどのようにして確認したのでしょうか? 上記のことを考慮に入れてもう一度チェックしてみてください。
クエリはパラメータ化することをお勧めします。また、WHERE 句は固定しておいて、DropDownList の SelectedValue プロパティの値によって全件抽出と条件抽出の両方に対応できるようにしてはいかがでしょう。詳しくは以下のページを見てください。DropDownList を使って絞込み
http://surferonwww.info/BlogEngine/post/2011/07/17/Showing-records-selected-by-DropDownLists-into-GridView.aspx- 編集済み SurferOnWww 2015年4月6日 4:16 誤字訂正
-
はい。EmptyDataTemplate が表示されています。
SQL自体はMySqlDataSource.SelectCommandをウォッチし、
テキストビジュアライザーで中のSQLコマンドを確認致しました。
このSQLをPHPAdminなどで発行すると正常に取得できております。
また、不思議なことに、同不具合のあるページを
本番環境であるレンタルサーバで動作させると問題なく動作しました。
(テーブルやデータは全てPHPAdminを使って同じにしています)
-----------------------------------------------------------------
開発用PC
Windows8 Pro、VsiaulStudio Commity2013 (ASP.net C#)
ASP.NET開発サーバ、IIS8、Framework4.5
MySQL Server 5.6、MySQL Connector Net 6.6.5
-------------------------------------------------------------------
実行環境 (レンタルサーバ:WILLNET)
Windows Server 2012、Microsoft-IIS/8.5、Framework4.5
MySQL Community Server 5.1.73、mysqlnd 5.0.11-dev
------------------------------------------------------------------- -
開発環境では NG で、運用環境では OK ということでしょうか?
逆だと原因究明は難しいものがあるかもしれませんが、開発環境で問題を再現できるのだからいくらでも調べようがあります。
> SQL自体はMySqlDataSource.SelectCommandをウォッチし、
> テキストビジュアライザーで中のSQLコマンドを確認致しました。
> このSQLをPHPAdminなどで発行すると正常に取得できております。「このSQLをPHPAdminなどで発行」とはどういうことですか? PHPAdmin というのは何だか知りませんが、クエリを直接、運用環境の(もしくは開発マシンの?)MySQL に投げたということですか?
SqlDataSource が一レコードも取得できてないから ListView の EmptyDataTemplate が表示されるということですよね。であれば、そんなことをするのではなく、SqlDataSource がレコードを取得して DataSet(デフォルト)を作っているかを調べることになるのでは?
一番疑わしいのがクエリだと思ったのですが、問題が発生する時のクエリを調べて、そのクエリ自体は大丈夫そうだと言うことがわかったのですよね。
であれば、次はその問題が発生するときのクエリで(即ち、DropDownList を問題が出るように選択して)SqlDataSource が期待通りレコードを取得できているか調べてみてください。
やり方は、(1) SqlDataSource.Selected イベントのハンドラの引数 SqlDataSourceStatusEventArgs オブジェクトの AffectedRows プロパティを調べるとか、(2) SqlDataSource.Select メソッドで DataView を取得してみるなど、開発環境なのでなんでも自由にできるはずです。
- 編集済み SurferOnWww 2015年4月6日 6:50 一部修正
- 回答としてマーク hys73 2015年4月9日 10:54
-
アドバイス頂きながら、ご連絡が遅くなり申し訳ありません
試行錯誤しているうちに、なぜか正常な動作をするようになり
何が問題だったのかの把握ができておりませんでした。
不具合が出ていたソースを後日確認しようとバックアップしておいたのですが、
今確認すると、やはり現状でも正常な動作をしております。
特にConnectorを入れなおした、web.configを弄ったなどは
ないのですが。。。
また、開発環境と実行環境の記述も間違っておりました。
開発用PCは数か月前に6.9.6を入れております。
-----------------------------------------------------------------
開発用PC
Windows8 Pro、VsiaulStudio Commity2013 (ASP.net C#)
ASP.NET開発サーバ、IIS8、Framework4.5
MySQL Server 5.6、MySQL Connector Net 6.9.6
-------------------------------------------------------------------
実行環境 (レンタルサーバ:WILLNET)
Windows Server 2012、Microsoft-IIS/8.5、Framework4.5
MySQL Community Server 5.1.73、MySQL Connector Net 6.9.5
-------------------------------------------------------------------
DropDownList.SelectedIndexChanged イベントについても、
イベントからdrp_chanege_handler()を呼び出す形になっており、
掲載が横着になっておりました。申し訳ありません
protected void drp_tanto_SelectedIndexChanged(object sender, EventArgs e)
{
drp_chanege_handler();
}
結果的に原因がわからずじまいで大変恐縮ですが、
SqlDataSource.Selected イベントのAffectedRows プロパティで取得したレコード数を
確認する方法を教えて頂いたので、次回同様の現象が発生した時点で再度確認するように致します。
お手数をおかけ致しましたが、一旦解決済とさせて頂きます。
ありがとうございました。