ASP.NETの真実!

 ASP.NET2.0で、WEBブラウザーを使用したアプリケーションを作成しています。すったもんだした揚句、ほぼ1年ぶりに、納品したものの手直しをしています。無償なのですが、仕方ないのですねぇ。

 直接の顧客ではなく、中間の受注会社のまとめ役の人間がいたのですが.......、結局、1年ぶりぐらいに、いじくることになって四苦八苦です。何しろ、突貫工事で作成したものなので、いろいろと不備があったのですが、先方の要求がとこちらの問い合わせがうまくかみ合っていなかったということになるのでしょうが。ロジックを思い出すのに、よいこらしょでした。

 そんな中、雄たけびが頭を襲います。浮かび上がる技術的問題。、2点で、どつぼにはまってしまったのです。

 一点は、「フォームを何もしないのに、エンターキーを入力すると、ログアウトしてしまう。同じように、テキストボックスで漢字変換につづけて、エンターキーを連続して入力すると、ログアウトしてしまう。」という指摘です。

 そんな馬鹿なと思って、やってみたら、開発環境でも、立派に再現してしまいました。WEBアプリの作成は初めてだったので、皆目理由がわかりません。早速インターネットで調べたら、出るわ出るわ、既知の問題だったんですね。

 なんだかんだ調べて、フォーム上でのエンターキーを無効にする方法とテキストボックスにフォーカスがある時のエンターキーを無効にする方法をを何とか実装し、うまくいったと思ったのですが、翌日、細かく検査すると、あれまぁ、マルチラインのテキストボックスのエンターキーが利かなくなっているではありませんか。

 よく考えたら、テキストボックスのエンターキーを無効にしたのだから、当然、複数段落の入力はできないのでした。これは困ったと、あtれやこれやしているうちに、テキストボックスではなく、フォームにフォーカスがある場合にも、エンターキーを入力するとログアウトして相まうようになってしまいました。


<FORM id="Form1" method="post" runat="server"
onkeydown="if(event.keyCode==13){
if(window.event.srcElement.type=='text'){return false;}}">
  を記述することによりTextBoxのイベントの発生を制御。
フォームタグを
<form id="Form1" method="post" runat="server" onkeydown="if( (event.keyCode == 13) && (event.srcElement.type == 'text') )return false;">
としたところ、予定通りの動きをしているので、これでいこうかと思います。

などという記述を見つけていたので、これを適用していたのですが、どうやってもうまくいきません。
1日過ぎて、本当に、この条件でいいの? と考え出し、プロパティを別のにしたり、いろいろ試しても、結局だめでした。
 諦めかけていた時、
<FORM id="Form1"
onkeydown="
if(event.keyCode==13)
{
if (window.event.srcElement.type!='submit' &&
window.event.srcElement.type!='textarea')
{ return false; }
}
">

という記事を見つけ、if文の条件が逆ではないかと思いながら、試したところ、エンターキーを無効にすることができました。
 ということは、前のほうの解決策の条件文がおかしい? ということになります。

 う~ん、どちらが正解なんだ、と思いながらも、後者をとりあえず採用した次第です。

 これで、テキストボックスでのエンターキーは無効になり、フォームのエンターキーの無効は、見えないボタンをFormオブジェクトのタグの次に作成し、これも、常套手段であるといわれているonclick属性で「OnClientClick="return false;"」を設定することで実現しました。

 2点目は、これも、既知の問題である「GridViewのヘッダ^行を固定にして、表をスクロールさせる。」ということです。
 スクロールができるということはチェックしていたので、ヘッダーがずれたり、ビュー全体がずれたりするというので、おかしいおかしいと思っていました。
 再現する条件をいろいろと試していたら、GridViewの天地よりも、ブラウザーの天地を縮めてブラウザーのウインドウにスクロールバーを出させた状態で、フォームをスクロールさせると、GridViewのヘッダーだけずれたり(逆に、スクロールしないで、そのままの位置に残ってしまう)、表全体が、動いてしまうという現象が確認できました。

 もう、? ? の連続です。

 これも、ヘッダー固定方法で調べるとあちこちで書かれている、CSSを作成し、ヘッダーのCSSCLASSに設定するという方法をとっていましたので、一件落着と思っていたのですが、足元をすくわれたんですね。

<style>
.Freezing
{
position: relative;
top:expression(this.offsetParent.scrollTop);
z-index: 10;
}
</style>


 このCSSを、scroll設定をautoにしたPanelで囲まれた中のGridViewのHeaderStyle設定のCssClassに設定するというわけです。

<asp:GridView ID="GridView1" runat="server" ・・・>

<HeaderStyle CssClass="Freezing" ・・・ />


 これでうまくいったと思っていたのでうが、伏兵が現れてしまったというわけです。

 ようやく、VisualStudioで自動生成される、

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

に問題があるということがわかりました。
 標準モード(上記のDocumentTypeを設定してある状態)では、うまく動かないのだそうで、これをコメント扱いにし、互換モードで動かさないといけないのだそうです。

 いやはや、ようやく、このDocumentoTypeをコメントアウトし、動かしてみたら、見事、スクロールに関しては。問題なく、ヘッダーが固定されていました。

 しかし、このおかげで、ボタンに張り付けてある文字やテキストボックスの中の文字サイズが大きくなって。それらのオブジェクトんサイズの調整をしなければならないというはめになってしまいました。

 この固定ヘッダーに関しては、モトソリューションさんのホームページがよくまとまっており、参考になりました。

 どうも、Webで業務系のアプリケーションを作成するのは、”めんどくさいなぁ~!!”という気になってしまいます。だって、Windows,MacといったOSの差、IE,Firefoxなどといったブラウザーの差、おまけに、バージョンの差とくれば、”統一しろよ!”と叫びたくなってしまいますね。

 クライアントアプリケーションならば、Mac非対応ならば、それですむし、windows2000以下は対応しないということでいいのですが、Webとなると、入り乱れて、制約がつけられません。根本的な問題が理解できているお客さんならいいのですが、Webで、どこでも、いつでも、だれでも使えるということを頭から信じている人たちに、業務系アプリケーションをWebで供給するのは間違いですね。

 しかも、クライアントアプリケーションのスピードと操作性を要求するなんて、??ですね。

 ブラウザーなのに、入力編集するということが、そもそも矛盾した概念!! て言うことですよ。

 SillverLite、Airでも持ってくるしかないのでしょうか。

Microsoft Silverlight 2テクノロジ入門 (マイクロソフト公式解説書)
日経BPソフトプレス
Laurence Moroney

ユーザレビュー:
初めてSilverl ...
amazon.co.jpで買う
Amazonアソシエイト by ウェブリブログ


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのトラックバック