カテゴリー: VB.NET

  • VBで全角の文字列を半角の文字列に変換する

    strConv関数を使うことで、文字列の種類を変えられる。

    ■例)

     Dim Text As String = "WHAT TIME IS IT NOW?"
     Dim narrowText As String = StrConv(Text, VbStrConv.Narrow)
    

    ・VbStrConv.Narrow で文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換
    ・VbStrConv.Wide で文字列内の文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換

    他にも、VbStrConv.XXXで指定することにより、ひらがなからカタカナ、
    繁体字を簡体字、というように変換用のセットが用意されているため、
    簡単に変換することができる。

    なお、例のように全角文字から半角文字に変換する場合、
    文字列に含まれたカタカナが半角カタカナに変換されてしまうので注意が必要。

    カタカナのケアだけ別途やる必要があるので、万能ではない。
    カタカナが混じる場合は、別途組み合わせて対応が必要。

  • VBで「August 31, 2012」のフォーマットで日付を表示させる方法

    VBで、どうしても「アルファベットの月表示 日, 年」のフォーマットで出力する必要があった。
    表示が「August 31, 2012」になるように整えなければならなったのだ。
    (今回は、本当にVB.NETでやった。古くて大変だった・・・)
    いろいろと調べてみると、上のフォーマットに曜日や時間つきで
    表示するフォーマットはあったが、月と日と年だけを表示するという
    フォーマットはなかった。

    組み合わせることによって、下記のフォーマットでいけることが判明。

     "MMMM d, yyyy"
    

    ポイントは、MMMMのところ。これにより、月が省略されない形で表示される。

    しかし、問題はこれだけではなく、日付の出力では実行環境のロケールをみていることが判明。
    英語で出力しようとしていたら、日本語で出力されて、文字化け。
    (ちなみにどんな日本語で出力されたかは不明・・・)
    整形して出力する際に、ロケールを指定する必要があった。

    こんな感じで書くとよい

     Dim usDate as Date = Date.Now()
     Dim culture As New System.Globalization.CultureInfo("en-us")
     Label.text = usDate.ToString("MMMM d, yyyy", culture)
    

    関数にするなら、こんな感じ。
    (日付フォーマット以外の文字列を渡すとクラッシュするので、その場合は空文字を返すようにしている)

         '----------------------------------------------------
         ' August 31, 2012 のフォーマットで文字列を返す関数
         '----------------------------------------------------
         Private Function getDateMDYformat(ByVal str As String)
             Try
                 Dim usDate As Date = str
                 Dim culture As New System.Globalization.CultureInfo("en-us")
                 Return usDate.ToString("MMMM d, yyyy", culture)
             Catch ex As Exception
                 Return ""
             End Try
     
         End Function
    

    ロケールによって出力が変わるというところは、かなりハマった。
    CultureInfoでちゃんと指定してやれば、US以外のフォーマットでも出せるとわかったのはめっけもん。
    VBは、やれることは多いんだけど、調べるのが大変だ。

  • VBで改行コードを文字列に入れる方法

    VBで変数やコントロールに改行コードを入れるには、vbCrLfを指定する。
    (ControlChars.CrLf と指定してもよい)

    ■使い方

     Dim str As String
     str = "一行目" & vbCrLf
     str &= "2行目"
    

    ちなみに vbCr ならキャリッジリターン、vbLf ならラインフィードになる。
    開発によっては、vbLfを使うこともありえる。

  • VBで定数宣言などの部分を折りたためるようにまとめる方法

    VBでコードを書いているとコードの冒頭に定数宣言などを多数書く。
    これが長くなってしまうとソースコードの可読性が下がってしまう。
    定数宣言などが長くなる場合には、#Region ディレクティブ / #End Region ディレクティブ を使用し読みやすくする。

    #Region ディレクティブを使用することで、Visual Studioのコードのアウトライン機能で 展開や折り畳みができるようになる。

    ■使い方

    Public Class DefaultClass
    
    #Region "定数宣言"
       Private Const ACTIVE_FLAG = 1
       Private Const NONACTIVE_FLAG = 0
       Private Const TAX = 0.05
    #End Region
    
  • VBで全角のダブルクォートを表示・指定する方法

    VBで全角のダブルクォート”を入力しようとすると、
    半角のダブルクォートに 自動変換されてしまう。
    VBで全角のダブルクォートを指定する場合は、 Chr(&H8168)  のように指定する。

    Chr(&H8168)
    

    半角のダブルクォートの場合は、 ControlChars.Quote と指定する。

  • ASP.NET(VB)でセッション変数を消す方法

    ASP.NETでSessionを使用していると個別に作成したセッション変数
    (例えばSession(“id”)とか)を削除したい場面がある。
    ASP.NETで一度作成したSession変数を削除するには、Removeメソッドを使用する。

    ■使い方

     Session.Remove("セッション変数名") 

    Removeメソッドに個別のセッション変数を指定することで必要のないものを削除できる。
    ちなみに、

     Session("セッション変数名") = Nothing

    だと、セッション変数の中身がなくなるだけで、セッション変数は残り続ける。
    セッション変数がある状態の場合、サーバ側のリソースが消費されている状態のため、
    使わなくなったセッション変数はRemoveメソッドで破棄することが望ましい。

    また、すべてのセッション変数を消す(破棄する)には、RemoveAllメソッドを使用する。

    ■使い方

     Session.RemoveAll()

    これでまとめて破棄することができる。
    ただし、自分が意図しないセッション変数も削除されてしまうため、使用する場合には
    他への影響がないか確認しておく必要がある。

    ■例)

     'Session変数を新しく作る
     Session("userName") = "CharAznable"
     
     'Session変数を破棄する
     Session.Remove("userName")
    
  • ntext型、text型、image型は将来SQL Serverで廃止予定

    ntext型、text型、image型は将来のSQL Serverでは廃止のなので、
    同じ機能を持った別 の型に変更(変換)する必要がある。
    DBのテーブルはテーブル定義を変えたり、データ 移行を行えばよい。

    システム(ASP.NETで作ったアプリとか)で型指定している箇所がある場合、
    テーブル定義 を変えてしまうと動作しなくなる。
    そのため、システムの改修が必要。

    ちなみに、SQL Server 2012では使える。
    次のバージョンでの廃止勧告でのないので、 まだ余裕で使える。
    システム改修のないまま簡単に数年は経過は禁物。
    (こういうのってタイミングの問題だったりするので・・・)

    古い型 新しい型
    ntext型  →  nvarchar(max)
    text型  →  varchar(max)
    image型  →  varbinary(max)

    ■参考URL
    http://msdn.microsoft.com/ja-jp/library/ms187993.aspx
    http://msdn.microsoft.com/ja-jp/library/ms143729.aspx

    ■おまけ:廃止された機能
    2008 R2で廃止 http://msdn.microsoft.com/ja-jp/library/ms144262.aspx
    2012で廃止 http://technet.microsoft.com/ja-jp/library/ms144262(v=sql.110).aspx

  • VB.NETで変数にダブルクォートをいれる

    とても初歩的ことなのだが、VB.NETで変数またはLabelなどのtextに ”(ダブルクォート)を入れる方法。

    VB.NETでは、文字列を”で囲む必要があるため、ダブルクォートで囲まれた場合は文字列として認識してしまう。
    “を変数やLabelのtextに入れる場合、1つだけ書いてしまうとそこで文字列が終わったことになってしまう。
    ‘ シングルクォートで囲もうにも、これはコメントアウトとして用いられるので使えない。
    ダブルクォートを変数に入れる場合には、ダブルクォートを2回連続で入力することでエスケープされる。

    たとえば、こんな感じ。

     Dim Str1 AS String = "ダブルクォートは、""と入れる"
    

    ダブルクォートだけを入れたい場合はこうなる。

     Dim Str2 AS String = """"  '4つ連続で入れると1つだけ変数に入る。
    

    よくやりそうなあたりだと、こんな感じか。

     Dim Email AS String = "hoge@xenos.jp"
     Dim Name AS String = "ほげ"
     Dim Address AS String
     
     Address = """" & Name & """,""" & Email & """"
    

    これだと、”hoge”,”hoge@xenos.jp” になる。
    ダブルクォートだらけで混乱しそうだ。
    個数は、インテリセンスが警告してくれるので、どこかで気がつくだろう。
    初歩的なことだが、知らないと入力しようがなく時間がとられてしまう。
    一度、覚えてしまえば特殊すぎて忘れない(はず)。

  • VB.NET 2008 (ASP.NET)でテキストボックスでEnterキーを押下したときに実行されるボタン指定する方法

    VB.NETで作成したウェブアプリのテキストボックス等でEnterキーを押したときに実行されるボタンを指定したい。
    通常は、ウェブのForm上にあるボタンのうち、一番最初に記述された(配置された)ボタンになっている。
    Enterキーを押したときに動作するボタンを指定する方法は以下。

    1. Enterキーを押下したときに実行するボタンのプロパティから、UseSubmitBehiviorを探し、Trueになっていることを確認する。
    2. 次にEnterキーを押下したときに実行したくないボタンのプロパティのUseSubmitBehiviorの値をFalseに変更する。
    3. 他のボタンも同じようにFalseに変更する。

    この方法でEnterキーを押した際に、1で設定したボタンが実行されるようになる。
    ただし、この方法で実行できるのは1つのボタンだけなので注意。

    Webでは、FormのAcceptButtonプロパティで設定する方法が多数見つかる。
    だが、VWD2008で設定を行おうとするとAcceptButton?プロパティは見つからず設定ができない。
    そのため、UseSubmitBehaviorで設定する。
    より正確に言えば、UseSubmitBehaviorは、PostBackが走った時に実行されるボタンクリックイベントについての記述になる。
    このプロパティの値がTrueのもので一番最初のものが実行されているに過ぎない。
    そのため、EnterキーでなくてもPostBackが走るのであれば実行される(はず)。

  • Visual Studio のバージョン依存に苦戦した。

    大した内容ではないが、備忘録もかねて書いておく。

    昨日、PCを新しくしたところVBの”.sln”ファイルが開かないエラーに遭遇した。先に結論を書いておくと、ツールの些細なバージョンで違いで開く際にエラーになった。Visual Web Developer 2008 Expressにサービスパックが適用されているかどうか、これが原因だった。

    元々、作成に使用していたのはVisual Web Developer 2008 Express で新しいPCはOSこそWindows 7に上げたがIDEは同じくVisual Web Develper 2008 Expressだ。新PCでは、インストールに本に付属のDVDを使用して、開発に必要な環境を一括でそろえた。この状態で各種アップデートの後、”.sln”ファイルを開いたところ「このバージョンのファイルはvisual studioでは開けません」というようなエラーが発生した。何度か試してみたが状況は変わらず。仕方がないので、Visual Web Developer 2008 Express をアンインストールして、再度インストールした。今度は、”.vbproj”ファイルが開けないという。Visual Web Developerが起動しても、表示されるのは、XML形式のvbprojファイルだけ。エラーになっている箇所は、表示してくれるものの解決策はわからない。途方にくれて、MSのサイトをみてみるとSP1があるようなので当ててみることにした。SP1のファイル単体は見つからず、ウェブインストーラーしか見つからない。ウェブインストーラーを使って上書きインストール。もう一度、slnファイルから試してみると正常に開いた。

    同じツールであっても、SP(サービスパック)が適用されているかどうかで、ファイル形式が違うようだ。slnファイルのアイコンには、起動するバージョンの数字が書いてあったが、SPの有無までは解らない。(もしかしたら、どこかに簡単に見分ける方法があるのかもしれないけれど。)(2008形式なら数字は9、2010形式なら数字は10というように見分けがつく。)Visual Studioのファイルは、上位の(新しく発表された)Visual Studioで開くと、slnファイルが更新されてしまい、下位バージョンで開けなくなるのは知っていた。まさか、SPの有無でさえ開けない事態になるとは思っても見なかった。もうちょっと、互換性を作ってくれるといいのけど、MSだし無理だよな。