« 2012年1月 | メイン | 2012年5月 »

2012年2月23日 (木)

[ASP.NET]IEのファイルダウンロードダイアログの「開く」ボタンを非表示にする方法

またまた、お客さんから。
『ダウンロードするときに「開く」を押して間違ってXボタンを押しちゃうのをどうにかしたい!』
とのこと。
しかもたまたまそこのダウンロードの機能だけ、ダウンロード時にフラグを更新してしまって
1回きりしかダウンロードできない仕様なので、
「開く」→ファイルのXボタンを押すともう2度と出てこなくなるんだよね…。
(Temporary Internet Filesを探してもらうのも大変だし。。。)

というわけで、ダウンロードファイルは「保存」しか使えないようにしましょうと提案。


これは下記のサイトを参考にさせていただきました。

ASP.NET(C#)でIEのファイルダウンロードダイアログボタンをカスタマイズ niyoな日記
http://niyodiary.cocolog-nifty.com/blog/2009/09/aspnetcie-b7f4.html

ボタンを消せることにも驚いたけど、いろんな方法があるのね。
(参考にしたサイトでは3種類の方法がありました)


私はヘッダのmetaタグに設定する方法にしました。

<meta id="metaDownloadOptions" runat="server" name="DownloadOptions" content="noopen" />
※サーバー側で設定をいじることがなければ、「runat="server"」は不要。

この1行を追加すると、
見事にダウンロードダイアログから「開く」ボタンが消えたので、一件落着!

2012年2月22日 (水)

[ASP.NET][AjaxControlToolkit][Javascript]NumericUpDownExtender操作時のイベント

テキストボックスにAjaxControlToolkitのNumericUpDownExtenderを付けて、数値を1ずつ増減できるのを付けたのだけど、
お客様からの要望で、

1.1〜9は"01"〜"09"に。
2.UpDownする度に、ほかのコントロールを操作したい。

そしてこれをサーバー側ではなく、クライアント側で処理してほしい、
つまりJavacsriptで実現してほしいということになった。

NumericUpDownExtenderにUpDownする時のイベントがあれば簡単だなーと思っていたら、
そんなものは用意されてなかった。。。(私が見つけられなっただけかもしれないけど…)

仕方がないので、TextBox.Attributes["onchange"]に(<input type="text" onchange="・・・" />のこと)
関数を書くことにした。

下に、テキストボックスと最小値とチェックボックスのIDを渡し、
最小値以上の数値が入力された場合はチェックボックスにチェックを入れるという関数を書いてみた。
-------------------------------------------------
function txtChange(obj, min,chkid){
    var e = obj;//テキストボックス
    var i = parseInt(e.value);
    var chk = document.getElementById(chkid);

    if(i < 10){
        e.value = "0" + String(i);
    }
    if(i > min && !chk.checked){
        chk.checked = true;
    else{
        chk.checked = false;
    }
}
------------------------------------------------
これで1.と2.の実現ができた。

しかし、問題が…。
このチェックボックスが曲者で、UpDownの操作が無くても手動で設定できる仕様だったので、
初期ロード時にDBから値をセットした時や、
何かの操作でPostBackが発生してしまう時にもこのtxtChange関数が動いてしまって、
手動で設定した内容が消えてしまうのだ。
(例:最小値2に設定し、テキストボックスには4と入力したが、チェックボックスのチェックは手動で外した場合、
PostBackが発生すると、またチェックがついてしまう。)

NumericUpDownを操作するときだけ、
つまり、サーバー側の操作でテキストボックスの値が変えられる時以外で上の関数を呼び出したいんだけどなぁ。

ちょっと悩んだけど、Page_Load「以外」がわかればいいので、
Javascriptのwindow.onloadを使えばいいんじゃないか!とひらめいた。

というわけで、ページロードがされたかどうかを判断するフラグを置いて、ロード時に"1"を立てるようにした。
--------------------------------------------
<input type="hidden" id="OnLoadFlg" 〜/>を設置。
======================
window.onload = function(){
    document.getElementById("OnLoadFlg").value = "1";//ページロードされた場合1を立てる
}
function txtChange(obj, min,chkid){
    var e = obj;//テキストボックス
    var i = parseInt(e.value);
    var chk = document.getElementById(chkid);
    var onLoadFlg = document.getElementById("OnLoadFlg");

    if(i < 10){
        e.value = "0" + String(i);
    }
    //ページロード時以外の場合にチェックの処理
    if(onLoadFlg.value == "0"){
        if(i > min && !chk.checked){
            chk.checked = true;
        else{
            chk.checked = false;
        }
    }
    onLoadFlg.value = "0";//フラグを元に戻す
}
------------------------------------------------

ちょっと不細工だけど、これで思ったような処理ができた。
もっとスマートな方法があれば教えてください><

2012年2月13日 (月)

[ActiveReports] 環境によって余白やページサイズが変わるのを防ぐには

久々にドツボ。
本番環境と開発環境で、ActiveReportsで作ったPDFのページサイズが違う・・・
クライアントからの問い合わせで発覚。

<開発環境>
Visual Studio2008 C# / ASP.NETのWebアプリ
.NET Framework 2.0
ActiveReports for .NET 3.0J SP3 Version 5.2.1053.1

<ページサイズの違い>
開発環境:222.2mm×296.7mm(※現行システムもこのサイズ
本番環境:222.2mm×279.4mm

なんと2cm弱も違う。
現行システムから、ページ設定は1ミリも変えてないのになぜ…?
最初は、レポートデザインのDetailやPageFooterの縦の長さを変えたらいけるだろうと思ってたら、全然うまくいかず。
余白を2cm削ってみたものの、現行システムと全く同じのレイアウトにならないので微妙…。

ActiveReports for .NET 3.0Jのリリースノートには、

  レポートの作成および表示処理は、ご利用の環境のハードウェア構成等に依存します。
  特定のOS、プリンタ、ドライバなどの組み合わせによって、プレビューや印刷結果が異なったり、一部正しく出力されない場合があります。
ftp://ftp.grapecity.com/trial/ActiveReportsNET/ReleaseNote_5210531.htm

と書いてある。
じゃあ原因は、サーバの環境依存なのかな?
というところまではわかったんだけど、結局どうすれば良いかわからず、藁にもすがる思いで、
先輩に「どーすればいいんですか(>Д<;)」と聞いてみた。

そしたらすんなり、方法を教えてもらえた!さすが先輩(・∀・)
参考URL
http://www.ilovex.co.jp/Division/SRD/archives/2008/03/activereportpdf.html

これと、先輩の送ってくれたコードを元に、
こんな関数を追加してみた。

/// <summary>
/// PDFページ設定
/// </summary>
/// <typeparam name="ReportType">帳票タイプ</typeparam>
/// <param name="rpt">帳票インスタンス</param>
/// <remarks>サーバ環境依存によるページ設定違い回避</remarks>
public static void PdfSetting<reporttype>(DataDynamics.ActiveReports.ActiveReport3 rpt)
where ReportType : DataDynamics.ActiveReports.ActiveReport3
{
    rpt.Document.Printer.PrinterName = "";//プリンタの設定を使用しないようにする
    rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4;
    rpt.PageSettings.PaperWidth = (float)8.27;//inch
    rpt.PageSettings.PaperHeight = (float)11.69;//inch
}

これを帳票インスタンス生成時に

...PdfSetting<reporttype01>(this);

とか書いてやれば、初期化してくれるどの帳票で呼び出しても大丈夫(・∀・)

参考URLの記事は、自分でも調べてたときにヒットして一読してたのに、すっかり見落としてた…
これを読んで必要な情報かどうか判断できるというのは技術と経験の差だわね…
自分の未熟さを実感したので、これからも精進しないと><

フォトアルバム

2012年5月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

My Photostream

  • Flickrにアップしてる写真の一部です。
    www.flickr.com
    This is a Flickr badge showing public photos and videos from micek_flicek. Make your own badge here.

クリック募金

  • クリックで救える命がある。
Powered by Six Apart