アーカイブ

Archive for 2013年1月

ストアアプリに含まれるBindableBaseのOnPropertyChangeってプロパティー名渡す必要ないんだ。

遅まきながら、ストアアプリを作ろうかと思ったわけです。

こんなコードを書いたらReSharperが修正したほうがいいよ。と教えてくれた

無題  無題2e

えっ!?通知元名消しちゃっていいの?と思ってOnPropertyChangedの定義を見たら、

        /// <summary>
        /// プロパティ値が変更されたことをリスナーに通知します。
        /// </summary>
        /// <param name="propertyName">リスナーに通知するために使用するプロパティの名前。
        /// この値は省略可能で、
        /// <see cref="CallerMemberNameAttribute"/> をサポートするコンパイラから呼び出す場合に自動的に指定できます。</param>
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var eventHandler = this.PropertyChanged;
            if (eventHandler != null)
            {
                eventHandler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

あー、CallerMemberName属性が付与されているから、コードコメントのように呼び元と同じプロパティー名だったら省略可能なんだね。なるほどねー。久々にC#やるとおろおろする。

カテゴリー:ストアアプリ, プログラミング タグ:

ASPXに対するJavascriptのインテリセンスが有効にならないと思ったら、Resharperのせい?

Visual Studioを使っていると、外部Javascriptファイルのインテリセンスも結構頑張って出してくれるじゃないですか、WebFormsを使っていたりすると、ページ側にこんな変数を定義してページとは別に定義したJavascript側でこの変数を参照したりとかするわけですよ。

ASPX側(WebForm1.aspx)

<script type="text/javascript" src="<%= ResolveClientUrl("~/Scripts/jquery-1.9.0.js")%>"></script>
<script type="text/javascript" src="<%= ResolveClientUrl("~/WebForm1.aspx.js")%>"></script>
<script type="text/javascript">
    var clientIds = {
        textBox1: "#<%= textBox1.ClientID %>",
        textBox2: "#<%= textBox2.ClientID %>",
        button1: "#<%= button1.ClientID %>"
    };

JS側(WebForm1.aspx.js)

/// <reference path="~/WebForm1.aspx"/>
$(function() {
    $(clientIds.button1).on("click", function() {
        $(clientIds.textBox2).val($(clientIds.textBox1).val() + (new Date().toString()));
    });
});

JS側の1行目にreferenceディレクティブでASPXへのパスが指定されているので、javascript側でclientIdsのオブジェクト一覧がインテリセンスに出るはずなんです。MSDNにもそう書いてあります。。。が、なぜか出ないのです。どうもReSharper側の問題だったようです。ReSharperのオプション→InteliSense→GeneralからインテリセンスのタイプをVisual Studioにしたところ

image

ちゃんとclientIdsのプロパティーの一覧が候補に出てくれました!!やったー♪

無題

だけれど、JSだけのために切り替えるのも微妙なんですよね。対応してくれないかなー。

カテゴリー:メモ, Visual Studio タグ: ,

えっ!!ODP.NETをNugetでインストール!?

Oracle関連の調べ物をしていて、今更ながらVisual Studio 2012に対応したODAC 11.2 Release 5の存在に気づいたわけですが、こいつの詳細を調べていたらnugetにODP.NETとODACが登録されているのを発見しました。

ODP.NET

Oracle Data Provier for .NET (ODP.NET) x86 112.3.20

Oracle Data Provier for .NET (ODP.NET) x64 112.3.20

ODAC

ODACのnugetパッケージを作っているのはOracleではなくて、milesibstosさんという方らしいです。

ODAC 11.2 Release 5 (11.2.0.3.20) with Xcopy Deployment(x86)

ODAC 11.2 Release 5 (11.2.0.3.20) with Xcopy Deployment(x64)

image

ODACをインストールすると、Nugetのパッケージフォルダーに関係するODP.NETも同時にインストールされます。インストールされたフォルダーを見ると、インストールされたのはDLLが8個だけ、、、えっこれだけで動作するはずが、、、

image

実行してみる。。。

とりあえず、超シンプルなコードを書いて実行してみる。。。。あれ?

image

System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。 —> Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
   場所 Oracle.DataAccess.Client.OracleInit.Initialize()
   場所 Oracle.DataAccess.Client.OracleConnection..cctor()
   — 内部例外スタック トレースの終わり —
   場所 Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
   場所 WindowsApplication4.Form1.Button1_Click(Object sender, EventArgs e) 場所 C:\Users\Sugiyama\Documents\Visual Studio 2012\Projects\WindowsApplication4\WindowsApplication4\Form1.vb:行 9

Nugetのパッケージページを見るとこんなサマリーが。どうやらこのNugetパッケージにはOracleを使ったアプリケーションをコンパイルするために必要なDLLだけが含まれているようですね。

This NuGet package contains Oracle.DataAccess.dll (x86 – both the net20 and net40 versions) needed to compile a project that uses Oracle’s ODP.NET Library. Oracle will still need to be installed on the production or development machine in order to connect to Oracle (those libraries are greater than 100MB in size, so it didn’t make sense to include them in a NuGet package), but this package will at least allow the project to be successfully built (i.e. if you’re using a CI server).

VBのUsing構文で変数を指定しない

データベースの更新を行うクラスの単体テストを書く場合、特別な環境がない場合はTransactionScopeを定義だけしてその中にテストコードを書きます(ロールバックを任せる)。

<TestMethod()>
Public Sub ドメインにグループが存在しない場合は0件のリストを返すこと()
    Const testDomain = "unittest.com"
    Using ts = New TransactionScope()
        ' このテストのクリーンアップ
        DeleteTestRow(testDomain)
        AddTestRow(testDomain)

        Dim node = GroupNode.FindByDomain(testDomain)
        Assert.IsNotNull(node)
        Assert.AreEqual(0, node.Count())
    End Using
End Sub

まぁいいんですけれど、ReShaperを使っていると、未使用の変数ということでTransactionScopeのインスタンスを一時的に格納しているtsという変数がグレーになります。

image

おもむろに ts = を消してみました。

image

あれ、エラーにならない。てっきりVBでは一度変数に受けないとだめだと思っていたんですが、この書き方もできるんですね。そういえば以前書いたこの記事でもWith句で変数を指定していなかった記憶があります。って事は少なくとも.NET 3.5時代はすでにできたんでしょうね。

With Hoge.FindById(1)
    .Remove()
End With

ただ、相変わらずCatch句では変数を指定しないとダメですね。まぁ構文上しょうがない気もするけれど。

image

Sharepointのビューでユーザー列をグループ化できないと思ったら

Sharepointのビューでユーザー列をグループ化できないと思ったら、 ユーザー列が、複数選択可能になってた。あんまり複数選択可能にしないから、なんでグループ化出来ないのかわからず悩んでしまった。

カテゴリー:メモ, 雑記 タグ: