VBControlArray

VB.NET - コントロールの配列に似た処理を行う方法

 VB.Net ではコントロールを配列化することはできません。プログラムコードで複数のコントロールを For 文で一括処理したい ことがあります。例えば Label1, Label2, ...Label30 があるとしてそれらのプロパティ .Tag を参照して ListBox1にリストアップしたい としましょう。これを1つ1つ

ListBox1.Items.Add(Label1.Tag)  .....
と30行を書いていたのではプログラムコードが冗長すぎてしまいます。このような場合、次のようにして コントトロール配列に似た構文 を用いてFor 文で処理をすれば格好よく収まります。ただし、この方法では各コントロールのイベントを発生させることや、プロパティを書き換えることはできません。できるのはただプロパティを受け身で参照することだけです。

1. まず、次のような関数を用意します。 それは コントロール疑似配列化のための関数です。この関数をModule1.vbに作成しておきます。
引数indexに番号を受け取って、その番号が付いたフォーム内のLabelコントロールを返します。

'(Module1.vb)
    Function arryLabel(ByVal i As Integer, frmc As Control) As System.Windows.Forms.Label
        Dim ctrl As Control = frmc.Controls("Label" & i.ToString)
        arryLabel = DirectCast(ctrl, System.Windows.Forms.Label)
    End Function

ここに frmc はコントロールのコンテナを指示する引数です。

2. 一連の処理をしたいフォーム、例えば Form1に、ListBox1があるとして Label1, Label2, ...Label30 のプロパティ Tag をリストアップする処理を考えましょう。どのようなプロパティでもよいですが、それらを参照するだけでそのコントロール上の イベントを用いないという条件が必要です。

'(Form1.vb)
    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim i As Integer

        ListBox1.Clear()
        For i = 1 To 30
            ListBox1.Add(arryLabel(i, Me).Tag)
        Next i
    End Sub

3. 上記の事例は処理対象のコントロールが Form1 上に直接貼り付けられている場合です。もし別のコンテナ、 例えば Form1 にTabControl1があり、そのTabPage2 に Label1, Label2, ...Label30 があるときにはそのコンテナを指示 しなければなりません。

                     .
                     .
        For i = 1 To 30
            ListBox1.Add(arryLabel(i, Me.TabControl1.TabPages(1)).Tag)
        Next i
                     .

VBRichtextFont

VB.NET - RichTextBoxのフォントが勝手に変わってしまう問題

 VB.Net でフォームにリッチテキストボックスを貼りつけてこれに英数字記号などをキー入力すると、あらかじめデザイン時に指定してある使用フォントとは無関係に、勝手に別のフォントが使われてしまう。もっとも困るのは \ を入力してもバックラッシュ記号になってしまう。これは英語圏で使われているフォントで、Arialというフォントらしい。これを無効にするには次のようにすればよいことがわかりました。

 まず、リッチテキストボックスを組み込んでいるフォームのデザイン編集画面を開きます。ここではそのフォームをForm1.vb[デザイン] とします。またそこに置かれているリッチテキストボックスをRichTextBox1だと仮定します。
そのフォームのタイトルバーをダブルクリックします。すると下記のように Sub Form1_Load(..........) が現れます。そこで次のように

RichTextBox1.LanguageOption=RichTextBoxLanguageOptions.UIFonts
の一文を入れます。これで問題解消します。
'(Form1.vb)

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        RichTextBox1.LanguageOption = RichTextBoxLanguageOptions.UIFonts
    End Sub
参照サイト
[SoftLandの入り口へ]