C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[29]: 【GridView(ヘッダ固定)】DropDownList


(過去ログ 66 を表示中)

[トピック内 32 記事 (1 - 20 表示)]  << 0 | 1 >>

■36224 / inTopicNo.1)  【GridView(ヘッダ固定)】DropDownList
  
□投稿者/ T_A~K_A (2回)-(2009/05/25(Mon) 16:45:03)

分類:[ASP.NET (VB)] 

■開発環境
 OS   :Windows2003 Server
 言語  :ASP.Net
 ブラウザ:IE6

■事象
 CSSを使ってGridViewのヘッダーを固定にしています。
 テンプレート列にドロップダウンリストを設置すると
 スクロールした際にドロップダウンリストがヘッダーの上に重なってしまう。

 調査したところヘッダに設定している[z-index]がドロップダウンリストに対して正しくきいていないようです。
 IE7では改修されているようです。

 参考URL「http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47862&forum=7

■回避策
 参考URLをもとに回避策を試みましたが、確かに縦スクロールに関しては回避できました。
 しかし、今回私が抱えている要件では縦&横スクロールが存在します。
 横スクロールを行うと、やはり事象が発生してしまいます。
 どなたか、よい回避策をご存知の方いらっしゃいませんでしょうか?宜しくお願い致します。

【ヘッダ > ドロップダウン】 => NG(z-indexがきかない)
【ヘッダ > IFrame > ドロップダウン】=> OK(IFrameをかませるとz-indexがきく)


引用返信 編集キー/
■36226 / inTopicNo.2)  Re[1]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (20回)-(2009/05/25(Mon) 17:04:32)
縦スクロールに対してやった対策と同じやり方で良いのではないでしょうか?
横スクロールに対応するヘッダ部分(日本語おかしいかも)に、Iframeを配置すればいいと思います。
引用返信 編集キー/
■36237 / inTopicNo.3)  Re[2]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (3回)-(2009/05/25(Mon) 21:10:18)
No36226 (ぱると さん) に返信
> 縦スクロールに対してやった対策と同じやり方で良いのではないでしょうか?
> 横スクロールに対応するヘッダ部分(日本語おかしいかも)に、Iframeを配置すればいいと思います。

返信ありがとう御座います。縦スクロールに対して行っている対策は下記の通りです。
同様に横スクロールに対応するIFrameを配置するには、どのように実現すれば宜しいのでしょうか?

window.onload = function() {
var fr = document.createElement("iframe");
var tb = document.getElementById("table1");
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 = "solid 1px blue";
fr.frameBorder = 0;
fr.scrolling= "no";

div1.appendChild(fr);

div1.onscroll = function() {
fr.style.top = ( this.scrollTop - 1 ) + "px";  ★
fr.style.left = ( this.scrollLeft - 1 ) + "px"; ☆
}
}

上記コードで☆の部分を追加して、横スクロールを行ったら無限に横スクロールするようになってしまいました。

また、別な方法ですが主となる[div1]を横スクロールが発生した場合に無理やり(+1)してから(-1)するようにフラグにて実現しましたが
上下スクロールバーのちらつき、及びヘッダ部のちらつき(ドロップダウンがちらちらする)してしまいました。
これでは、ちらつきすぎて却下になりそうです。何かよい方法はないのでしょうか・・・。
引用返信 編集キー/
■36241 / inTopicNo.4)  Re[3]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (21回)-(2009/05/26(Tue) 09:56:25)
HTML側の構造がわからないので勘で。
divの中にtableがあると勝手に想像します。

以下の内容を追加してみたらどうでしょう?
間違ってそうなところは適当に直してください。
fr2に背景色をつけて、z-indexを一時的にdivより大きくすることでちゃんと覆いかぶさってるか確認できると思います。

//ここから
var fr2 = document.createElement("iframe");

fr2.style.width = header.cells[0].offsetWidth + "px"; //1行目の1列目の横幅
fr2.style.height = dv.offsetHeight + "px"; //divの高さと同じだけ
fr2.style.zIndex = 8;
fr2.style.position = "absolute";
fr2.style.top = 0;
fr2.style.left = 0;
fr2.style.border = "solid 1px blue";
fr2.frameBorder = 0;
fr2.scrolling= "no";

//提示されたソースではdiv1に追加しているが、div1が何を指してるかわからないためとりあえずdv
dv.appendChild(fr);
//ここまで

ずうずうしいお願いなんですが、今縦横スクロールをどうやって実現しようか悩んでて…
できればどんなスタイルを設定してるか教えてほしかったりします。
(tableタグは1つで実装してるんですよね?)
引用返信 編集キー/
■36242 / inTopicNo.5)  Re[4]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (22回)-(2009/05/26(Tue) 10:03:36)
dv.appendChild(fr);

dv.appendChild(fr2);
の間違いです。
引用返信 編集キー/
■36254 / inTopicNo.6)  Re[5]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (4回)-(2009/05/26(Tue) 12:05:44)
No36242 (ぱると さん) に返信
> ずうずうしいお願いなんですが、今縦横スクロールをどうやって実現しようか悩んでて…
> できればどんなスタイルを設定してるか教えてほしかったりします。
> (tableタグは1つで実装してるんですよね?)

返信ありがとう御座います。
現状のテストソースで宜しいでしょうか?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>XXXXX</title>
<meta http-equiv="pragma" content="no-cache" /><meta http-equiv="Cache-Control" content="no-cache" />
</head>
<style type="text/css">
html, body {
font-size: 12px;
}
.Freezing {
z-index: 10;
top: expression(this.offsetParent.scrollTop);
left:expression(0);
position: relative;
}
.FreezingColFix {
position: relative;
}
</style>
<script type="text/javascript">
<!--
window.onload = function() {
// ローカル変数宣言
var fr = document.createElement("iframe"); // オブジェクト追加
var tb = document.getElementById("GridView2"); // 対象[Table名]オブジェクト取得
var dv = document.getElementById("div1"); // 対象[Div名]オブジェクト取得
var header = tb.rows[0]; // 0行目[Heder]情報取得
var w = header.offsetWidth; // 横 取得
var h = header.offsetHeight; // 縦 取得

// IFrame設定
fr.style.width = w + "px"; // 横 設定 [Table]と同じ値を設定
fr.style.height = h + "px"; // 縦 設定 [Table]と同じ値を設定
fr.style.zIndex = 9; // 重なりの順序を設定 [Table]より下の値を設定
fr.style.position = "absolute"; // 配置(絶対位置)を設定
fr.style.top = 0; // Top:0
fr.style.left = 0; // left:0
fr.style.border = 0; // ボーダー表示しない
fr.frameBorder = 0; // フレームの境界線を消す
fr.scrolling= "no"; // 常にスクロール不可

div1.appendChild(fr); // [Div]にIFrameを追加 (指定要素へ子要素追加)

// [Div]がスクロールしたか判定
div1.onscroll = function() {
fr.style.top = div1.scrollTop + "px"; // IFrameに[Div]のTop位置を設定
}
}
//-->
</script>
</head>
<body>
<div id="div1" style="position:absolute; overflow:auto; height:195px; width:200px; left: 81px; top: 391px;">
<table id="GridView2" style="border-style:None;">
<tr class="Freezing" style="color:White;background-color:#6B696B;font-weight:bold;">
<th class="FreezingColFix" align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px;width:30px;">あ</th>
<th class="FreezingColFix" align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px;width:80px;">い</th>
<th class="FreezingColFix" align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px;width:75px;">う</th>
<th class="FreezingColFix" align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px;width:15px;">え</th>
<th class="FreezingColFix" align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;height:11px;width:90px;">お</th>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
<tr>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
<td class="FreezingColFix"><select><option>23</option></select></td>
</tr>
</table>
</div>
</body>
<html>

ちょっと長いですが・・・こんなような感じで実装しております。
ちなみにドロップダウンの現象を確認できると思います。

引用返信 編集キー/
■36259 / inTopicNo.7)  Re[6]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (25回)-(2009/05/26(Tue) 13:19:25)
思ってたのと全然違った(汗

縦横スクロールって言ってたのでてっきり1列目も固定してスクロールしてるのかと思い込んでしまいました。

かといってここまで首を突っ込んでしまったので最後まで書くつもりですが、
いくつか聞きたい事があります。

・CSSで使用しているexpressionはIEでしか使えないので、なくしてもいいですか?
・その他にも結構変えちゃっても良いですか?
 例)<div><table>… を <div><div><table>… の形にしちゃいたいです。
引用返信 編集キー/
■36263 / inTopicNo.8)  Re[7]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (5回)-(2009/05/26(Tue) 13:43:20)
No36259 (ぱると さん) に返信
> 思ってたのと全然違った(汗
>
> 縦横スクロールって言ってたのでてっきり1列目も固定してスクロールしてるのかと思い込んでしまいました。
>
> かといってここまで首を突っ込んでしまったので最後まで書くつもりですが、
> いくつか聞きたい事があります。
>
> ・CSSで使用しているexpressionはIEでしか使えないので、なくしてもいいですか?
> ・その他にも結構変えちゃっても良いですか?
>  例)<div><table>… を <div><div><table>… の形にしちゃいたいです。

返信ありがとう御座います。
CSSのexpressionを消してもOKです。IE6で期待動作するならば問題ありません。
結構変更しても構いません。何とか回避策があるのであればどんな手段でも問題ありません。

以上、宜しくお願い致します。
引用返信 編集キー/
■36265 / inTopicNo.9)  Re[8]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (26回)-(2009/05/26(Tue) 14:32:43)
最初は全部CSSでやりたかったんですが、Javascriptに頼ってしまいました…。

結局IE専用じゃないかと言う突っ込みは自分でしておきますorz

変えたとこ(html)
・CSSの記述とJSの記述をほぼなくしました。
  →javascriptでやらせています。
・headタグの閉じタグが2つあったので一つ消しときました。
・ヘッダのtrの閉じタグがなかったので追加しました。
・tableタグにwidth指定をしました。

cssと違って表示に少し時間がかかるかもしれません…。

--htmlファイル--
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>XXXXX</title>
    <meta http-equiv="pragma" content="no-cache" /><meta http-equiv="Cache-Control" content="no-cache" />
    <style type="text/css">
        html, body {
            font-size: 12px;
        }
    </style>
    <script type="text/javascript" src="ScrollTable_mini.js"></script>
    <script type="text/javascript">
        var ScrollTable1 = new ScrollTable('GridView2','div1');
    </script>
</head>
<body>
    <div id="div1" style="position:absolute; overflow:auto; height:195px; width:200px; left: 81px; top: 391px;">
        <table id="GridView2" style="border-style:None;width:290px;">
            <tr style="color:White;background-color:#6B696B;font-weight:bold;">
                <th align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px; width:30px;">あ</th>
                <th align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px; width:80px;">い</th>
                <th align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px; width:75px;">う</th>
                <th align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;font-size:12px;height:11px; width:15px;">え</th>
                <th align="center" valign="middle" scope="col" style="border-width:1px;border-style:Ridge;height:11px;width:90px;"> お</th>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
            <tr>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
                <td><select><option>23</option></select></td>
            </tr>
        </table>
    </div>
</body>
<html>

引用返信 編集キー/
■36266 / inTopicNo.10)  Re[9]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (27回)-(2009/05/26(Tue) 14:33:38)
--javascriptふぁいる

//テーブル初期化(New時に呼ばれる)
var ScrollTable = function(tableId,headId){
    //プロパティ一覧
    this.tableId = tableId;                         //テーブルID
    this.table = undefined;                         //メインtable
    this.headId = headId;                           //ヘッダID
    this.header = undefined;                        //ヘッダdiv
    this.body = undefined;                          //明細div
    this.scroll_XBar = undefined;                   //横軸スクロールバー
    this.scroll_YBar = undefined;                   //縦軸スクロールバー
    this.scroll_X = undefined;                      //横軸スクロールバーの中身
    this.scroll_Y = undefined;                      //縦軸スクロールバーの中身
    this.maxHeight = 0;                             //縦軸最大サイズ
    this.maxWidth = 0;                              //横軸最大サイズ
    this.isScrollX = true;                          //横スクロール有フラグ
    this.isScrollY = true;                          //縦スクロール有フラグ
    
    if(navigator.appName == 'Microsoft Internet Explorer'){
        this.isIE = true;                           //ブラウザ種別:Internet Explorer
        this.isFF = false;                          //ブラウザ種別:Firefox
    }else if(navigator.appName == 'Netscape'){
        this.isIE = false;
        this.isFF = true;
    }else{
        this.isIE = false;
        this.isFF = false;
    }
    
    var me = this;
    this.addEvent(window,'load',function(){me.Table_Load();});
}

//テーブル初期表示処理
ScrollTable.prototype.Table_Load = function(){
    var hedHeight = 0;
    var borderHeight = 0;
    //テーブル設定
    this.table = document.getElementById(this.tableId); 
    if(this.table == undefined){
        return false;
    }
    this.table.style.borderCollapse = 'separate';
    var me = this;
    //イベント設定
    this.addEvent(document,'click',function(){return me.SetXY();});
    //ヘッダ設定
    this.header = document.getElementById(this.headId);
    this.header.style.overflow = 'hidden';
    if(this.table.firstChild.tagName == 'THEAD'){
        this.header.style.paddingTop = this.table.firstChild.offsetHeight + 'px';
        for(var i=0;i<this.table.firstChild.childNodes.length;i++){
            borderHeight = Number(this.table.rows[i].cells[0].style.borderTopWidth.replace('px','')) + Number(this.table.rows[i].cells[0].style.borderBottomWidth.replace('px',''))
            switch(this.table.rows[i].cells[0].style.borderStyle){
                case 'ridge':
                    borderHeight = borderHeight + 2;
                    break;
            }
            this.table.rows[i].style.position = 'absolute';
            this.table.rows[i].style.top = hedHeight + borderHeight + 'px';
            this.table.rows[i].style.left = this.table.rows[this.table.rows.length - 1].offsetLeft;
            hedHeight = hedHeight + this.table.rows[i].offsetHeight;
        }
    }else{
        borderHeight = Number(this.table.rows[0].cells[0].style.borderTopWidth.replace('px','')) + Number(this.table.rows[0].cells[0].style.borderBottomWidth.replace('px',''))
        switch(this.table.rows[0].cells[0].style.borderStyle){
            case 'ridge':
                borderHeight = borderHeight + 2;
                break;
        }
        this.header.style.paddingTop = this.table.rows[0].offsetHeight + borderHeight + 'px';
        this.table.rows[0].style.position = 'absolute';
        this.table.rows[0].style.top = '0px';
        if(this.table.rows.length > 1){
            this.table.rows[0].style.left = this.table.rows[1].offsetLeft;
        }
    }
    //明細設定
    this.body = document.createElement('div');
    if(this.isScrollY == true){
        this.body.style.overflowY = 'hidden';
        if(this.isIE == true){
            this.addEvent(this.body,'mousewheel',function(){me.ScrollMouseW(window.event);});
        }else{
            this.addEvent(this.body,'DOMMouseScroll',function(e){me.ScrollMouseW(e);});
        }
    }
    //ヘッダとテーブルの間に明細を入れる
    this.header.removeChild(this.header.firstChild);
    this.body.appendChild(this.table);
    this.header.appendChild(this.body);
    
    //横軸スクロールバー追加
    if(this.isScrollX == true){
        this.scroll_XBar = document.createElement('div');
        this.scroll_XBar.style.overflowX = 'scroll';
        this.scroll_XBar.style.overflowY = 'hidden';
        this.scroll_XBar.style.position = 'absolute';
        this.scroll_XBar.style.zIndex = '1';
        this.addEvent(this.scroll_XBar,'scroll',function(){return me.GrdScrollX();});
        document.body.appendChild(this.scroll_XBar);
        this.scroll_X = document.createElement('div');
        this.scroll_XBar.appendChild(this.scroll_X);
    }
    //縦軸スクロールバー追加
    if(this.isScrollY == true){
        this.scroll_YBar = document.createElement('div');
        this.scroll_YBar.style.overflowY = 'scroll';
        this.scroll_YBar.style.overflowX = 'hidden';
        this.scroll_YBar.style.position = 'absolute';
        this.scroll_YBar.style.zIndeY = '1';
        this.addEvent(this.scroll_YBar,'scroll',function(){return me.GrdScrollY();});
        document.body.appendChild(this.scroll_YBar);
        this.scroll_Y = document.createElement('div');
        this.scroll_YBar.appendChild(this.scroll_Y);
    }
    
    //見た目調整
    this.maxHeight = this.header.offsetHeight;
    this.maxWidth = this.header.offsetWidth;
    me.SetXY();
    me.onload();
}

//onloadイベント
ScrollTable.prototype.onload = function(){}

//イベント追加処理
ScrollTable.prototype.addEvent = function(place,name,shori){
    if(place.addEventListener) {
        place.addEventListener(name,shori,false);
    }else{
        //IEはこの処理を通る
        place.attachEvent("on"+name,shori);
    }
}

//スクロールバー(横軸)のスクロール時処理
ScrollTable.prototype.GrdScrollX = function(){
    this.header.scrollLeft = this.scroll_XBar.scrollLeft;
}

//スクロールバー(縦軸)のスクロール時処理
ScrollTable.prototype.GrdScrollY = function(){
    this.body.scrollTop = this.scroll_YBar.scrollTop;
}

//明細をマウスホイールでスクロールした場合の処理
ScrollTable.prototype.ScrollMouseW = function(e){
    var move;
    if(this.isIE == true){
        move = e.wheelDelta;
    }else{
        move = e.detail * 10 * -1;           //Firefoxはスクロールが遅いので加速
    }
    this.scroll_YBar.scrollTop = this.scroll_YBar.scrollTop - move;
}

//テーブルとdivの幅合わせ
ScrollTable.prototype.SetXY = function(){
    var changeY = 0;
    var changeX = 0;
    var tableY = this.table.offsetHeight;
    var tableX = this.table.offsetWidth;
    var headY = Number(this.header.style.paddingTop.replace('px',''));
    //明細の横幅調整
    if(tableX > this.maxWidth){
        //横幅の最大値を超えている場合
        changeX = this.maxWidth;
    }else{
        changeX = tableX
    }
    this.body.style.width = tableX + 'px';
    this.header.style.width = changeX + 'px';
    //明細の高さ調整
    if(tableY > this.maxHeight - (headY * 2)){
        //高さの最大値を超えている場合
        changeY = this.maxHeight - (headY * 2);
    }else{
        changeY = tableY;
    }
    this.body.style.height = changeY + 'px';
    this.header.style.height = changeY + 'px';
    //スクロールバーの設定
    var obj = this.header;
    var x = 0;
    var y = 0;
    while(obj) {
        x += obj.offsetLeft;
        y += obj.offsetTop;
        obj = obj.offsetParent;
    }
    if(this.isScrollX == true){
        this.scroll_XBar.style.top = y + changeY + headY + 'px';
        this.scroll_XBar.style.left = x + 'px';
        this.scroll_XBar.style.height = '16px';
        this.scroll_XBar.style.width = changeX + 'px';
        this.scroll_X.style.width = tableX + 'px';
    }
    
    if(this.isScrollY == true){
        this.scroll_YBar.style.top = y + headY + 'px';
        this.scroll_YBar.style.left = x + changeX - 4 + 'px';       //4は微調整
        this.scroll_YBar.style.width = '20px';
        this.scroll_YBar.style.height = changeY + 'px';
        this.scroll_Y.style.height = tableY + 'px';
    }
    
}

引用返信 編集キー/
■36267 / inTopicNo.11)  Re[10]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (28回)-(2009/05/26(Tue) 14:35:22)
最後に、javascriptの説明です。

こんなに長くするはずじゃなかったんだけどなぁ…。


/*                                                                                      */
/* スクロールテーブル                                                                   */
/*                                                                                      */
/*  前提条件(ブラウザ):このスクリプトはIE6またはIE7でのみ動作確認を行っています。      */
/*    試しにFirefox3で確認してみましたが、IE専用の記述を使用している箇所が              */
/*    多数あるため、表示はできても動かせないです。                                      */
/*    今のところクロスブラウザにする予定はありません。                                  */
/*                                                                                      */
/*  前提条件(画面):画面には以下のように記述してください。                              */
/*    <div id="親divのID"><table id="テーブルのID"> … </table></div>                   */
/*    テーブルの代わりに<asp:GridView id="テーブルのID">でも構いません。                */
/*       GridViewを使用する場合、ページングを上に表示しないでください  。               */
/*    Repeaterでも可能です。その場合、tableタグのIDをテーブルのIDとしてください。       */
/*                                                                                      */
/*  前提条件(テーブル):                                                                */
/*    1行目は必ずヘッダ行にしてください。                                               */
/*    theadタグを使用することで複数行をヘッダにする事が可能です。                       */
/*    ただし、ヘッダ行でrowspan属性は使用できません。                                   */
/*                                                                                      */
/*  前提条件(スタイル):親divに対して以下の項目を設定してください。                     */
/*    position:absolute または relative                                                 */
/*    width:横幅の最大値(設定しない場合、テーブルの初期サイズが最大になります)          */
/*    height:縦幅の最大値(設定しない場合、テーブルの初期サイズが最大になります)         */
/*                                                                                      */
/*  使用方法:画面側でこのjsファイルを読み込んだ後に以下の記述を行ってください。        */
/*    <script type="text/javascript src="ScrollTable.js"></script>                      */
/*    <script type="text/javascript>                                                    */
/*        var 任意の変数名 = new ScrollTable('テーブルのID','親divのID');               */
/*        マスターページとGridViewを併用する場合、IDの自動変更に注意してください。      */
/*        var 任意の変数名 = new ScrollTable('<%=GridView1.ClientID%>','親divのID');    */
/*    </script>                                                                         */
/*    上記で宣言した任意の変数名を利用して                                              */
/*    下のプライベート関数やプロパティを使用する事が可能です。                          */
/*                                                                                      */
/*  その他:テーブルのBorderは各自で設定してください。(負荷軽減のため)                  */
/*          tableタグのBorderは0pxにして、tdタグに設定してください。                    */
/*                                                                                      */
/*          ポストバックするとスクロール状態が一番上・一番左になり、                    */
/*          横幅がリセットされます。                                                    */
/*                                                                                      */
/*  プライベート関数一覧:                                                              */
/*      Table_Load…初期表示処理                                                        */
/*      onload…初期表示終了イベント                                                    */
/*      addEvent…イベント追加処理                                                      */
/*      GrdScrollX…横幅スクロール処理                                                  */
/*      GrdScrollY…縦幅スクロール処理                                                  */
/*      ScrollMouseW…マウスホイール処理                                                */
/*      SetXY…スクロールバー表示位置調節                                               */
/*                                                                                      */
/*   プロパティの一覧はテーブル初期化を参照してください。                               */

引用返信 編集キー/
■36268 / inTopicNo.12)  Re[10]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (6回)-(2009/05/26(Tue) 14:44:57)
No36266 (ぱると さん) に返信

ぱると様ありがとう御座います。

結果、期待動作しております。助かりました。
jsのコードはこれから一つ一つ追いかけて理解します。

本当に助かりました。感謝です。
解決済み
引用返信 編集キー/
■36315 / inTopicNo.13)  Re[11]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (9回)-(2009/05/27(Wed) 13:02:52)
No36267 (ぱると さん) に返信

1点問題がありました。申し訳ありません。

実は今回の要件の中に、大枠のスクロールバーが存在します。
その中にテーブルを3個中に配置しております。
1画面で収まらない為、大枠スクロールバーを設けて1画面に納める事で回避しております。
根本的に回避しているかは?ですが・・・。
画面の下にボタンが複数存在する為、
どの位置に大枠スクロールバーがいても常にボタンが押せるようにするというのが目的です。

ぱると様から提供して頂いたJSを中に存在するテーブルに適用したら期待動作しましたが、
大枠のスクロールバーを動かすと、中に存在するスクロールバーまで一緒に動いてしまいます。
まだ、奥深くまで解析はできていませんが恐らく[Table][Div]を引数で与えて[Div]のスクロールを消して
動的にスクロールバー[Div]をアペンドしてヘッダ行とデータ行を独立させる事によって実現しているので
はないかと考えております。
このスクリプトに対して、動的に生成したスクロールバー[Div]のstyle.Topを大枠スクロールバーが動いた
タイミングで位置を変更すればうまくいくのではないかと考えております。
大枠スクロールがスクロールしたイベントを追加してTop位置を算出して設定する。
実現できるとは思いますが、ちらつきが発生しないか懸念事項としてあります。

引き続き解析を進めます。何かよい方法があればご教示願います。勝手ながら申し訳ありません。

引用返信 編集キー/
■36343 / inTopicNo.14)  Re[12]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (29回)-(2009/05/27(Wed) 17:27:26)
もし今のHTMLが
<div id="jsに渡すID">
  <table id="jsに渡すID">…</table>
  <table>…</table>
  <table>…</table>
</div>

という配置であれば

<div>
  <div id="jsに渡すID">
    <table id="jsに渡すID">…</table>
  </div>
  <div id="こっちのIDも渡せる">
    <table id="こっちのIDも渡せる">…</table>
  </div>
  <div id="こっちのIDも渡せる">
    <table id="こっちのIDも渡せる">…</table>
  </div>
</div>
のようにするとうまくいくかもしれません。

引用返信 編集キー/
■36345 / inTopicNo.15)  Re[13]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (10回)-(2009/05/27(Wed) 17:49:37)
No36343 (ぱると さん) に返信
> もし今のHTMLが
> <div id="jsに渡すID">
> <table id="jsに渡すID">…</table>
> <table>…</table>
> <table>…</table>
> </div>
>
> という配置であれば
>
> <div>
> <div id="jsに渡すID">
> <table id="jsに渡すID">…</table>
> </div>
> <div id="こっちのIDも渡せる">
> <table id="こっちのIDも渡せる">…</table>
> </div>
> <div id="こっちのIDも渡せる">
> <table id="こっちのIDも渡せる">…</table>
> </div>
> </div>
> のようにするとうまくいくかもしれません。

返信ありがとう御座います。
今日一日ソースを解析しました。大枠スクロールバーの[Div]を引数で渡すように変更し
大枠スクロールバーが移動した場合は、style.top位置を更新するように改造しました。
また、SetXY関数が呼び出された後は必ず新規で作成した下記の関数をコールする事で
位置がずれないようにしました。

ScrollTable.prototype.StyleTopAdjustment = function(){
  var x = Number( this.Xscroll_Top.replace('px','') ) - this.pheader.scrollTop;
  var y = Number( this.Yscroll_Top.replace('px','') ) - this.pheader.scrollTop;

  this.scroll_XBar.style.top = x + 'px';
  this.scroll_YBar.style.top = y + 'px';
}

結果期待動作するようになんとかなりました。やや、ちらつくもののギリギリセーフかなと
個人的には思います。

ただ解決していない問題として、ヘッダ行のボーダーが設定できません。
また、データ行1行目に変な線が入ってしまっています。

恐らくJSを修正する必要があると考えております。まだまだ調査が必要な状態です。


引用返信 編集キー/
■36379 / inTopicNo.16)  Re[14]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (11回)-(2009/05/28(Thu) 10:10:32)
いつもお世話になっております。

◆昨日課題となっていた下記の件ですが、解決致しました。
@ヘッダ行にボーダーが設定できない。
Aデータ行1行目に変な線が入ってしまう。

GridViewのGridLinesプロパティにVertical(垂直グリッド線のみ表示)が定義してあったので
消したら正しくボーダーが設定されました。また、Aの線も消えました。

本件、全て解決致しました。これから細かい部分の調整が入ると思いますが、
期待動作しており副作用も今のところ発生しておりません。

ぱると様ありがとう御座います。

解決済み
引用返信 編集キー/
■36388 / inTopicNo.17)  Re[15]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (30回)-(2009/05/28(Thu) 11:26:40)
2009/05/28(Thu) 11:27:10 編集(投稿者)

後半たいして何もしてないですがお役に立てたなら良かったです。

編集:解決済チェック忘れ
解決済み
引用返信 編集キー/
■36716 / inTopicNo.18)  Re[16]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ T_A~K_A (12回)-(2009/06/04(Thu) 13:09:33)
No36388 (ぱると さん) に返信
> 2009/05/28(Thu) 11:27:10 編集(投稿者)
>
> 後半たいして何もしてないですがお役に立てたなら良かったです。
>
> 編集:解決済チェック忘れ

いつもお世話になっております。
既に解決済みとなっておりますが1点問題が発覚致しました。
現在、調査中ではありますが下記のような現象です。

◆現象
Tabキー押下でグリッドの中に存在する、テキストボックスやドロップダウンリストを巡回します。
この時、横及び縦のスクロールバーが同期して動きません。

基本的な作りは、スクロールバーが動いたら中のテーブルを移動する動作ですので
その逆の処理を実装する必要があるのかと考えております。

テーブルの座標は、どこの値を参照すればよいのでしょうか・・・。
何かよい方法があればご教示願います。何度も、申し訳ありません。
引用返信 編集キー/
■36728 / inTopicNo.19)  Re[17]: 【GridView(ヘッダ固定)】DropDownList
□投稿者/ ぱると (34回)-(2009/06/04(Thu) 14:33:38)
2009/06/04(Thu) 14:35:46 編集(投稿者)
不完全なものを出してしまってすいません。
Tabで動かした時に同期を取る方法です。

    //横軸スクロールバー追加 に追加
        this.addEvent(this.header,'scroll',function(){return me.TblScrollX();});
    //縦軸スクロールバー追加 に追加
        this.addEvent(this.body,'scroll',function(){return me.TblScrollY();});


//テーブル(横軸)のスクロール時処理
ScrollTable.prototype.TblScrollX = function(){
    this.scroll_XBar.scrollLeft = this.header.scrollLeft;
}

//テーブル(縦軸)のスクロール時処理
ScrollTable.prototype.TblScrollY = function(){
    this.scroll_YBar.scrollTop = this.body.scrollTop;
}

で一応できましたが、横軸を動かした時にコントロールが右端にちょこっとしか見えないですorz
this.scroll_XBar.scrollLeft = this.header.scrollLeft + 50;
とかってやりたかったですが、それだと循環参照になってしまいバーの右端まで行ってしまいます。

編集:使ってない関数を呼び出してたので削除

引用返信 編集キー/
■36731 / inTopicNo.20)  Re[18]: 【GridView(ヘッダ固定)】DropDownList
 
□投稿者/ ぱると (35回)-(2009/06/04(Thu) 15:18:00)
コントロールにフォーカスが当った時にずらせば良いみたいです。

例)
<input type="text" onfocus="Text_Onfocus();">
function Text_Onfocus(){
スクロールテーブルをNewしたときの変数.header.scrollLeft = スクロールテーブルをNewしたときの変数.header.scrollLeft + 30;
}

全部のコントロールに入れなきゃいけないかもしれませんが…。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -