- - PR -
GridViewで固定したヘッダーの表示位置
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-01-13 15:52
お世話になっております。
WINXP、VS2008(C#)、IE6.0で開発しております。 サンプルサイトを参考に、 CSSを使ってGridViewのヘッダー固定を実装しましたが、 テンプレート列にドロップダウンリストを設置すると、スクロールした際に ドロップダウンリストがヘッダーの上に重なってしまいます。 テキストボックスやラベルの場合は平気なのですが、この問題は解決可能なのでしょうか? CSSは以下の通りです。 .Freezing { z-index:10; position:relative; top:expression(this.offsetParent.scrollTop); } これを、GridViewのHeaderStyleに設定してます。 z-indexを変えてみても変わりません。 どなたか教えていただけませんでしょうか。 | ||||
|
投稿日時: 2009-01-14 05:36
IE6のバグなのでは?
IE7, IE8(beta)でも再現しますか? ちなみに、Firefox, Safari, chromeではどうですか? _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2009-01-14 11:58
Accessさん、お返事ありがとうございます。
IE7では、理想通りドロップダウンもヘッダーの背面を通過しました。 Firefox, Safari, chromeでは、CSSが利いてないようで、ヘッダー固定自体が無効でした。 他のアプリの都合でIE6もまだ多く、この現象なんとか回避できないかと、 情報探してますが、なかなか見つからない状態です。。 http://d.hatena.ne.jp/kumat/20060124/ こちらの方は回避されているようなのですが、いまいち方法が分からなくて。 見た目の問題なので、最悪はこのままという選択肢もあるのですが・・・ | ||||
|
投稿日時: 2009-01-14 13:59
ヘッダと同じ大きさで同じ場所に
<iframe>を配置すると良いみたいですよ。 z-indexはヘッダ>iframe>ドロップダウンリスト にすれば良いみたいです。 | ||||
|
投稿日時: 2009-01-14 15:58
ぱるとさん、お返事ありがとうございます。
すみません、iframeの用途がよく分かってないかもしれません・・・ iframeは、その中に別のページを表示するものとして認識しているのですが、 この場合は、src属性など無しで配置するということでしょうか? 下記のソースのいくつかの場所に配置して試したのですが、ビルドエラーや期待した動作になりませんでした。 ※下記ソースは構成のみで、属性などは省いてます。 <div style="overflow:auto; height: 500px;"> <asp:GridView> <Columns> <asp:TemplateField> <ItemTemplate> <asp:DropDownList></asp:DropDownList> </ItemTemplate> <HeaderStyle /> <ItemStyle /> </asp:TemplateField> </Columns> <HeaderStyle CssClass="Freezing" /> </asp:GridView> </div> この場合、<asp:GridView></asp:GridView>の外側に囲むように配置するということでしょうか? <asp:GridView>の中に配置すると、GridViewにそのようなプロパティが無いということで ビルドエラーになってしまいました。 どのような配置になるか教えて頂けると助かります。 | ||||
|
投稿日時: 2009-01-14 20:10
ヘッダ>IFRAME>テーブル の順です。
ヘッダはCSSで浮いているのでz-index により階層指定してあげれば その下に IFRAME をもぐりこませることができます。 スクリプトで ヘッダの大きさと表示位置を取得してそれと同じ大きさで 透明度1%のIFRAMEをヘッダの後ろに配置すれば、コンテンツに 表示されているリストBOXがヘッダの上に来ないように出来ます。 スクリプトで動的にIFRAMEを生成するので、src 属性は指定しなくても かまいません。敢えて指定するのであれば、サイズ0の loading.html なりを 作ってこいつを指定するようにします。 IE6の直ら(さ?)ない仕様らしいのでこれで対応してみてください。
若干無理があるかな・・・ まぁ、これを自分のコードに応用できるならやってみてくだされ。 わからないならどこがわからんのか指摘くだされ。 まずは、全部コピって試してみるがよろし。 追記:IFRAMEの上1ピクセル空いちゃうから、scrollTop-1 した 方がいいのかな・・・ [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2009-01-14 20:39 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2009-01-14 20:47 ] | ||||
|
投稿日時: 2009-01-15 11:32
ぴあちゃんさん、サンプルまで提示して頂き、ありがとうございます。
サンプルでの動作、確認できました!! JavaScriptの解析と応用はこれからになりますので、少々お時間ください。 でき次第、ご連絡しますので! | ||||
|
投稿日時: 2009-01-22 22:10
いつもお世話になっております。
宮崎と申します。 ぴあちゃんさんのサンプルを参考に GridViewを使用して作成してみました。 何故か、スクロールを行うと少しヘッダがずれてしまいますが 概ね実現することができました。 なぜヘッダがずれてしまうのかは、なぞのままです。。 <!--<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <head id="Head1" runat="server"> <title>無題のページ</title> <style type="text/css"> .Freezing { z-index:10; position:relative; color:#FFFFFF; vertical-align:middle; bgcolor='#64AEE6' color:#FFFFFF; height:25px; vertical-align:middle; top:expression(this.offsetParent.scrollTop-1); } </style> <script type="text/javascript"> window.onload = function() { var fr = document.createElement("iframe"); var tb = document.getElementById("GridView1"); var dv = document.getElementById("div1"); var header = tb.rows[0]; var w = header.offsetWidth; var h = header.offsetHeight; fr.style.width = w + "px"; fr.style.height = h + "px"; fr.style.zIndex = 8; fr.style.position = "absolute"; fr.style.top = 0; fr.style.left = 0; fr.style.border = 0; fr.frameBorder = 0; fr.scrolling= "no"; div1.appendChild(fr); fr.contentWindow.document.write("<body bgcolor='#64AEE6'></body>"); //このコメントを付けたりはずしたりして試せ。 div1.onscroll = function() { fr.style.top = this.scrollTop + "px"; window.status = this.scrollTop; } } </script> </head> <body style="height:100%"> <form id="form1" runat="server"> <div> <div id="div1" style="height:300px;overflow:auto;"> <asp:GridView ID="GridView1" runat="server" Height="253px" Width="733px"> <HeaderStyle CssClass="Freezing" /> </asp:GridView> </div> </div> </form> </body> </html> |