2015年12月3日木曜日

GetTypeで型名を見る C#

こんにちは山田です。

型名って忘れること多くないですか?
そんな時にこれさえ覚えとけば安心の、型名の出力方法の覚書です。
開発環境:ASP.NET 2.0
開発言語:C#

必要となる構文はこちらです。
 Object.GetType メソッド

例) ASPX側


 <%# Eval("AnimalName") %>


ASPX.CS側
protected void AddStatus(object sender, RepeaterItemEventArgs e)
{
  //is演算子でオブジェクトの型の確認
  if (e.Item != null && e.Item.DataItem is string)
  {
  Control ctl1 = e.Item.FindControl("ahref");
  //ct1の形名がわからないとき
  Response.Write(ctl1.GetType().Fullname);
  //出力は「System.Web.UI.HtmlControls.HtmlAnchor」となり型名を教えてくれる

  if (ctl1 != null && ctl1 is System.Web.UI.HtmlControls.HtmlAnchor)
  {
      //型名に合わせて安全にキャストできる
   ((System.Web.UI.HtmlControls.HtmlAnchor)ctl1).Href = "";
  }
}

2015年12月1日火曜日

CSVファイルとは?

こんにちわ、開発者のⅠです。

今回は、前回の投稿で触れたCSVファイルについて説明したいと思います。

CSVは「Comma Separated Values」のそれぞれ頭文字です。
”カンマ区切り文字”とでも言いましょうか。

「名前、経度、緯度」の各要素が書き込まれたCSVファイルを例にしてみると、

東京タワー, 35.658589, 139.745615
浅草 雷門, 35.711020, 139.796336
中央本線 笹子駅, 35.603862, 138.825087

という様式になっています。
カンマごとにマーカーの「各要素」が存在し、さらに「マーカー1つに一行のデータ」という対応関係になっていますね。

前回の投稿では、splitメソッドを使っていましたが、その際に区切り文字に”, (カンマ)”と”\n(改行コード)”を設定していたのはこういう理由からです。

このCSVファイルの作成・表示はMicrosoft社のExcelで実行可能ですが、若干の問題があります。
それは文字化けです。Excelでは新規ファイルを作成するときに、CSVファイルとして保存することが可能ですが、文字コードは「Shift-JIS」で固定されます。

自分の環境ではUTF-8を用いる必要があったため、このまま作成したCSVファイルを読み込むと、マーカーは表示されますが、インフォウィンドウの中身が見事に文字化けしました。
この対処法として、一旦メモ帳でファイルを開き、改めて『名前を付けて保存』で文字コードをUTF-8に設定しました。

しかし、編集するためにExcelでCSVファイルを開いてしまうと、再び文字コードが変更されるようで、文字化けが発生してしまいました……。

※Excel上で保存時に文字コードを指定できない理由わからず、自分と同じ悩みを持った人がネット上で見受けられました……。

現在は、VisualStudio上で編集を行っており文字化けは発生しておりません。

せっかく表示させたマーカーをクリックしてみたら、わけのわからない文字が羅列されていると大変残念な気持ちになります。くれぐれもご注意ください。

それではこの辺りで失礼します。


2015年11月30日月曜日

JavaScriptを使って外部ファイルを読み込む方法

こんにちわ、開発者のⅠです。

さて、前回から時間が空いてしまいましたが、GoogleMapに関わるお話の続きです。

前回は、Google Mapにマーカーを表示させる方法について紹介いたしましたが、今度はその応用として、マーカーのデータを外部ファイルから読み込む方法について紹介したいと思います。

今回は、名前、住所、座標(緯度と経度)を記録したCSVファイル(拡張子: .csv)を読み込む場合を例として挙げたいと思います。

まず、外部ファイルを読み込むために必要な関数 getCSVFileをMapオブジェクト宣言の下に記述します。
 
 function getCSVFile() {
   var xhr = new XMLHttpRequest();
   xhr.onload = function () {
   createArray(xhr.responseText);
   };

   xhr.open("get", "markerlist.csv", true);
   xhr.send();
 }
 getCSVFile();

次に、読み込んだCSVファイルのデータをsplitメソッドを使って "\n(改行コード)"毎に配列へ振り分けます。
続けて ", (カンマ) "毎に振り分けていきます。
そして、カンマで区切った名前、住所、座標の各データを変数name、address、latlngにそれぞれ代入します。
あとは、関数 createMarkerでマーカー生成し、インフォウインドウ(吹き出し)の中身をHTML形式で記述します。

function createArray(csvData) {
   var DataArray = csvData.split("\n");
   var csvArray = new Array();
   for (var i = 0; i < DataArray.length; i++) {
    csvArray[i] = DataArray[i].split(",");
   }

   insertData(csvArray)
  }

  
  function insertData(csvArray) {
   for (var i = 0; i < csvArray.length; i++) {

    // 配列csvArray[i][0]を変数nameに格納 
    var name = csvArray[i][0];

    // 配列csvArray[i][1]を変数addressに格納 
    var address = csvArray[i][1];

    // 配列csvArray[i][2]とcsvArray[i][3]を変数latlng に格納 
    var latlng = new google.maps.LatLng(csvArray[i][2], csvArray[i][3]);


    // 関数createMarkerに引数を指定します 
    createMarker(name, address, latlng, map)
   }
  }
 }

 // 引数で渡された値を変数に代入し{}内の処理を実行 
 function createMarker(name, address, latlng, map) {

  // InfoWindowクラスのオブジェクトを作成 
  var infoWindow = new google.maps.InfoWindow();

  // 指定したオプションを基にマーカーを作成 
  var marker = new google.maps.Marker({ position: latlng,  map: map });

  // addListener を使ってイベントリスナーを追加 
  // 地図上のマーカーがクリックされると{}内の処理を実行。
  // currentInfoWindowに値が入っているならば、既に開いている情報ウィンドウを閉じる 
  // 表示される情報ウィンドウは常に一つ 
  google.maps.event.addListener(marker, 'click', function () {
   
    if (currentInfoWindow) {
     currentInfoWindow.close();
    }

    // InfoWindowOptionsオブジェクトを指定します
    // HTML形式で記述する
    infoWindow.setContent(
    '
' + '
' + name + '
'+
'
' + address + '
' + '
' ); // マーカーに情報ウィンドウを表示 infoWindow.open(map, marker); // 開いた情報ウィンドウを変数へ格納 currentInfoWindow = infoWindow; }); } // ページ読込時に地図を表示 google.maps.event.addDomListener(window, 'load', initialize);

これで、マーカーの情報を外部ファイルから読み込むことが出来るはずです。
こうすれば、マーカーの追加・削除はソースコードではなく外部ファイルを編集するだけで済みますね。

それでは、今日はこの辺りで失礼します。

C# ref修飾子とout修飾子とは

こんにちは山田です。
メソッドに引数を参照渡しで渡す方法です。


メソッドの戻り値で完結することが多いのですが、
それ以外に、戻り値とは別に引数を返したい場合があります。

自分が使うシーンとしては、メソッドの戻り値でDBから取得したデータリストを取得して、
そのデータの個数の値を別個に取得したいときなどがあります。

開発環境:ASP.NET2.0
開発言語:C#

値渡しの場合と、参照渡し場合の違いをまとめてみました。

■元々(値渡しの場合)
    public static void A(int arg1)
    {
        arg1 = 50;
    }
    public static void Main()
    {
        int x = 10;
        A(x);
        Console.WriteLine(x);
    } 
出力は10のままで、呼び出しもとには影響がありません。


■ref修飾子(参照渡し)
    public static void A(ref int arg1)
    {
        arg1 = 50;
    }
    public static void Main()
    {
        int x = 10;
        A(ref x);
        Console.WriteLine(x);
    } 
出力は50になる
呼び出しもとの数値が変わりました。

■out修飾子(参照渡し)
outを使う場合はrefとは違い
あらかじめ値を代入しておく必要がなくなります。
    public static void A(out int arg1)
    {
         arg1 = 50;
    }

    public static void Main()
    {
        int x; //←ここで代入しても参照が渡ることはないです。
        A(out x);
        Console.WriteLine(x);
    } 
出力が50になる。

その代わりAメソッド内でoutパラメータのarg1の値を使用することができず、
必ず、新しい値が代入されてしまいます。

2015年11月27日金曜日

ASP.NETでのURLリライトの流れ


こんにちは山田です。
長年の疑問のURLリライトについてわかってきたので
その覚書です。 

開発環境:ASP.NET2.0
開発言語:C#
IIS:6.1

■URLリライトの別名
URLリライト=URL書き換え
日本語だとURL書き換えとなります。

■そもそもURLリライトは必要なの?
個人的な疑問としてページリライトの技術はURLから判断して、
IISのサーバーのファイルディレクトリ(どの階層にいるのか)がわかりにくくなるし、
今見ているページの関連する記事を探したい場合、URLの法則性がわからないのでなんと打ち込めばよいのかわからない等の感想を持っていました。(こんな使われ方は想定されていいないと思いますが、、、)

一般的にどういう目的で使われているかと
  • URLが短い。
  • URL入力が簡単になる。
  • URL を見ると、サイトの構造がわかる。
  • "短縮可能 (hackable)" である。つまり、ユーザーが URL の一部分を入力すれば、そのサイトを表示して目的のページに移動できる。
というメリットがあるので、やはり必要な技術のようです。
特にURLが短い場合、気軽にそのwebページにアクセスしやすくなりますね。

ASP.NET での URL 書き換え

↑ここをざっと読んでみたのですが。
Umm...よくわからない。

■自分なりに実装したページリライトの流れをまとめてみました。

・実態のURL:/contentDetail.aspx
・必要な引数: userID=yamada&contentID=101
・リライト後のURL: http://blog.jp/yamada0101/

URLで
http://blog.jp/yamada0101/ → とアクセスさせたかった場合
   ↓
web.configにリライトルールを記述する(事前に)
   ↓
IISがリライトルールにそって、そのURLから実態のURLに直す
(/yamada0101/→/contentDetail.aspx?userID=yamada&contentID=101)
    ↓
IISが実態のファイルのページを判定する
(/contentDetail.aspx)
   ↓
クエリスストリングの必要なIDをRequestで取得する
   ↓
取得したuserIDとcontentIDから目的のブログ記事を
DBから取り出してページをレンダリングする
   ↓
  終わり

この流れがわからなくて、もやもやしていました。
他の言語や、開発環境だとまた違うのかな?
またふと疑問に思ってしまいました。