トップ回答者
ListViewで特定の列を非表示にしたい

質問
-
ListViewで特定の列を表示にしたくて、LayoutCreatedイベントにて
列を非表示にする処理を書いてみたのですが、ヘッダー部は非表示になったのですが、
データ(行)部分が非表示になってくれません。
LayoutCreatedイベント内ではnullとなってしまいます。
データ部を非表示にするにはどうすれば良いでしょうか。
<div class="table-responsive"> <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 style=""> <td class="c1"> <asp:Label Text='<%# Eval("item") %>' runat="server" ID="itemLabel" /> </td> <td class="c2"> <asp:Label Text='<%# Eval("lot") %>' runat="server" ID="lotLabel" /> </td> <td class="c3"> <asp:Label Text='<%# Eval("price1") %>' runat="server" ID="priceLabel1" /> </td> <td class="c4"> <asp:Label Text='<%# Eval("price2") %>' runat="server" ID="priceLabel2" /> </td> <td class="c5"> <asp:Label Text='<%# Eval("recommend") %>' runat="server" ID="recommend" Visible="false" /> <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/osusume.png" Visible="false" /> </td> <td class="c6"> <asp:Label Text='<%# Eval("freetxt") %>' runat="server" ID="freetxt" Visible="false" /> <asp:Image ID="Image2" runat="server" ImageUrl="~/Images/info.png" Visible="false" /> </td> <td class="c7" runat="server" id="tbl_item_1_1"> <asp:TextBox ID="txt_data1_1" runat="server" Text="0" class="form-control text-right" ClientIDMode="Static" Width="80"></asp:TextBox> </td> <td class="c8" runat="server" id="tbl_item_1_2"> <asp:TextBox ID="txt_data1_2" runat="server" Text="0" class="form-control text-right" ClientIDMode="Static" Width="80"></asp:TextBox> </td> </tr> </ItemTemplate> <LayoutTemplate> <table border="0" class="table table-bordered table-hover table-striped table-hgroup scroll1"> <thead class="scrollHead"> <tr runat="server" style=""> <th runat="server" colspan="2"></th> <th runat="server" colspan="2">単価</th> <th runat="server" colspan="2"></th> <th runat="server" colspan="2" id="tbl_h1"> <asp:Label ID="lbl_date1" runat="server" Text="Label"></asp:Label></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> <th runat="server" class="c5">オススメ</th> <th runat="server" class="c6">お知らせ</th> <th runat="server" class="c7" id="lbl_date1_1">ケース数量</th> <th runat="server" class="c8" id="lbl_date1_2">バラ数量</th> </tr> </thead> <tbody class="scrollBody"> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </tbody> </table> </td> </tr> </table> </LayoutTemplate> <SelectedItemTemplate> <tr style=""> <td class="c1"> <asp:Label Text='<%# Eval("item") %>' runat="server" ID="itemLabel" /> </td> <td class="c2"> <asp:Label Text='<%# Eval("lot") %>' runat="server" ID="lotLabel" /> </td> <td class="c3"> <asp:Label Text='<%# Eval("price1") %>' runat="server" ID="priceLabel1" /> </td> <td class="c4"> <asp:Label Text='<%# Eval("price2") %>' runat="server" ID="priceLabel2" /> </td> <td class="c5"> <asp:Label Text='<%# Eval("recommend") %>' runat="server" ID="recommend" Visible="false" /> <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/osusume.png" Visible="false" /> </td> <td class="c6"> <asp:Label Text='<%# Eval("freetxt") %>' runat="server" ID="freetxt" Visible="false" /> <asp:Image ID="Image2" runat="server" ImageUrl="~/Images/info.png" Visible="false" /> </td> <td class="c7" runat="server" id="tbl_sel_1_1"> <asp:TextBox ID="txt_data1_1" runat="server" Text="0" class="form-control text-right" ClientIDMode="Static" Width="80"></asp:TextBox> </td> <td class="c8" runat="server" id="tbl_sel_1_2"> <asp:TextBox ID="txt_data1_2" runat="server" Text="0" class="form-control text-right" ClientIDMode="Static" Width="80"></asp:TextBox> </td> </tr> </SelectedItemTemplate> </asp:ListView>
protected void _listView_LayoutCreated(object sender, EventArgs e) { //HEADER(LayoutTemplate) HtmlTableCell tbl_h1 = (HtmlTableCell)_listView.FindControl("tbl_h1"); if (tbl_h1 != null) { tbl_h1.Visible = false; } //HEADER(LayoutTemplate) HtmlTableCell lbl_date1_1 = (HtmlTableCell)_listView.FindControl("lbl_date1_1"); if (lbl_date1_1 != null) { lbl_date1_1.Visible = false; } HtmlTableCell lbl_date1_2 = (HtmlTableCell)_listView.FindControl("lbl_date1_2"); if (lbl_date1_2 != null) { lbl_date1_2.Visible = false; } //BODY(ItemTemplate) HtmlTableCell tbl_item_1_1 = (HtmlTableCell)_listView.FindControl("tbl_item_1_1"); if (tbl_item_1_1 != null) { tbl_item_1_1.Visible = false; } //BODY(SelectedItemTemplate) HtmlTableCell tbl_sel_1_1 = (HtmlTableCell)_listView.FindControl("tbl_sel_1_1"); if (tbl_sel_1_1 != null) { tbl_sel_1_1.Visible = false; } }
回答
-
> 掲載したソースコードは値での制御以前に、まずはListViewの列の表示、非表示を理解しようと思い
> 作成したテストプログラムになります。条件によって表示 / 非常時を切り替えるとかを考える以前に、とにかく一列全てを非表示にする(td 要素の中の Label や TextBox を非表示にするのではなく、それらを含む td 要素を非表示にする)にはどうすれば良いかを試しているということですか?
#であれば、最初からその旨書いておいて欲しかったのですが。
> LayoutCreatedイベントでItemTemplateとSelectedItemTemplateのコントロールがなぜ、nullになるのかが
> わからず、LayoutCreated イベントがどの時点で発生するか MSDN ライブラリなどを調べてみたでしょうか? "LayoutTemplate テンプレートが作成されたときに発生します" と書いてありますよね?
その時点ではデータ行の td 要素(runat="server" 属性を付与すると HtmlTableCell)はまだ生成されてないはずで、だから null になったのだと思います。
ListView.ItemCreated イベントのハンドラで、引数の ListViewItemEventArgs オブジェクトの Item プロパティで ListViewItem オブジェクトを取得し、その中で FindControl メソッドで非表示にする HtmlTableCell を探し、その Visible プロパティを false に設定してみてください。
> コードブロック内で横スクロールせず確認できるように改行した方が良いという理解で良いでしょうか。そういうことです。
アップされたコードを質問者さん自身で読んでみて、読みやすいかどうか評価しましたか? そうしていただければ私の言っていることが分かると思いますが。
それから、コードを読むのは回答者・一般閲覧者にとってかなり負担が大きいことを理解してください。なので、コードを提示するというのは、どうしても文章では説明できない場合の最後の手段的なことと考えていただければと思います。
#とにかく提供する情報は正確にかつ十分に、返答はタイムリーにお願いします。- 回答としてマーク hys73 2015年4月9日 17:33
すべての返信
-
td 要素の中に入っている Label や TextBox の Visible プロパティを、ある条件で true / false に切り替えて設定すれば良いのですよね?
そうであれば、どういう条件で表示 / 非表示を切り替えるのか具体的に文章で書いてください。
そうでなければ、もう少し全体的に、かつ具体的にどうしたいのか文章で書いてください。
#コードは適当に改行を入れていただければと思います。でないと非常に見づらいです。#前に質問者さんが開いた別スレッドをきちんと最後までフォローしていただきたく。
-
回答ありがとうございます。
実際はもう少し列数があり(ケース数量、バラ数量が1週間分、すなわち14列あります)
データベース(mysql)からの値にしたがって、表示列数を制御したいと考えております。
掲載したソースコードは値での制御以前に、まずはListViewの列の表示、非表示を理解しようと思い作成したテストプログラムになります。
ポストバックの度に、LayoutCreatedイベントが発生することは確認できたので、データ部の非表示ができれば値や条件による制御は
できそうなのですが、LayoutCreatedイベントでItemTemplateとSelectedItemTemplateのコントロールがなぜ、nullになるのかが
わからず、ご質問させて頂いた次第です。
>>#コードは適当に改行を入れていただければと思います。でないと非常に見づらいです。
→こちらは申し訳ありません。ただ、ソースコードはコードブロックで挿入したのですが、
コードブロック内で横スクロールせず確認できるように改行した方が良いという理解で良いでしょうか。
>>#前に質問者さんが開いた別スレッドをきちんと最後までフォローしていただきたく。
→こちらも申し訳ありません。放置しているわけではないのですが、試行錯誤しているうちに正常な動作をするようになり
何が問題だったのかの把握ができておりませんでした。別スレッドにて回答するように致します。
-
> 掲載したソースコードは値での制御以前に、まずはListViewの列の表示、非表示を理解しようと思い
> 作成したテストプログラムになります。条件によって表示 / 非常時を切り替えるとかを考える以前に、とにかく一列全てを非表示にする(td 要素の中の Label や TextBox を非表示にするのではなく、それらを含む td 要素を非表示にする)にはどうすれば良いかを試しているということですか?
#であれば、最初からその旨書いておいて欲しかったのですが。
> LayoutCreatedイベントでItemTemplateとSelectedItemTemplateのコントロールがなぜ、nullになるのかが
> わからず、LayoutCreated イベントがどの時点で発生するか MSDN ライブラリなどを調べてみたでしょうか? "LayoutTemplate テンプレートが作成されたときに発生します" と書いてありますよね?
その時点ではデータ行の td 要素(runat="server" 属性を付与すると HtmlTableCell)はまだ生成されてないはずで、だから null になったのだと思います。
ListView.ItemCreated イベントのハンドラで、引数の ListViewItemEventArgs オブジェクトの Item プロパティで ListViewItem オブジェクトを取得し、その中で FindControl メソッドで非表示にする HtmlTableCell を探し、その Visible プロパティを false に設定してみてください。
> コードブロック内で横スクロールせず確認できるように改行した方が良いという理解で良いでしょうか。そういうことです。
アップされたコードを質問者さん自身で読んでみて、読みやすいかどうか評価しましたか? そうしていただければ私の言っていることが分かると思いますが。
それから、コードを読むのは回答者・一般閲覧者にとってかなり負担が大きいことを理解してください。なので、コードを提示するというのは、どうしても文章では説明できない場合の最後の手段的なことと考えていただければと思います。
#とにかく提供する情報は正確にかつ十分に、返答はタイムリーにお願いします。- 回答としてマーク hys73 2015年4月9日 17:33
-
回答ありがとうございます。
MSDNは見ていたのですが、LayoutCreated イベントでItemTemplateも生成されると
勝手に解釈しておりました。
教えて頂いた通りListView.ItemCreated イベントのハンドラで、HtmlTableCellを
探すように修正したところ、無事非表示にすることができました。
また、データベースからの値によっても表示、非表示を制御することもできました。
HtmlTableCell tbl_item_1_1 = (HtmlTableCell)e.Item.FindControl("tbl_item_1_1");
if (tbl_item_1_1 != null) {
tbl_item_1_1.Visible = false;
}
コードの提示につきましては、以後注意して掲載するように致します。
ありがとうございました。