Back to Top

Daily Archives: 2016年3月28日

VB.NETコンボボックス(ComboBox)

ComboBoxスタイル

ComboBoxのスタイルには3種類あり、DropDownStyleプロパティにより変更をします。
デフォルトではDropDownとなっています。

テキストを編集できないようにする

ドロップダウンされるリストからの選択のみを許し、テキスト編集(入力)を許可しなようにするには、ComboBoxのDropDownStyleプロパティをComboBoxStyle.DropDownListにします。

ドロップダウンリストに表示する項目数を変更する

DropDownStyleプロパティがDropDownまたはDropDownListの場合、右側のボタンを押して表示されるドロップダウンリストの項目数は、MaxDropDownItemsプロパティで変更できます。

ComboBox1.MaxDropDownItems = 20

指定した文字列と一致する項目を検索する

FindStringExactは、指定した文字列と一致する項目を検索します。該当項目がなければ、-1を、見つかれば該当Indexの値を返します。

ComboBox1.SelectedIndex = ComboBox1.FindStringExact("みかん")

項目を追加する

項目を追加する方法は、Items.Add・DataSourceなどがあります。

'Items.Addで設定
ComboBox1.Items.Add(New Fruit("0001", "リンゴ"))
ComboBox1.Items.Add(New Fruit("0002", "みかん"))
ComboBox1.Items.Add(New Fruit("0003", "いちご"))

または

'DataSourceで設定
Dim Fruits As New ArrayList()
Fruits.Add(New Fruit("0001", "リンゴ"))
Fruits.Add(New Fruit("0002", "みかん"))
Fruits.Add(New Fruit("0003", "いちご"))
ComboBox1.DataSource = Fruits

※Item.Add()で追加する出来るものはStringだけではありません。

表示を値を分ける

表示する項目と表示項目に対しての値を分けたい場合、の例を記載します。

・Items.Addで追加した場合、SelectedItemで取り出します。

・DataSourceで追加した場合、SelectedItem以外にSelectedValueで取り出せます。

通常は、TCommboBoxは、ToString()で取得出来るものをリストに表示します。

DisplayMemberでプロパティを指定する事により表示するものを変更することができます。

ValueMemberでプロパティを指定する事により、SelectedValueで取得出来るもの設定できます。

Public Class Fruit
    Protected m_strCode As String
    Protected m_strName As String

    Public Sub New(ByVal strCode As String, ByVal strName As String)
        Me.m_strCode = strCode
        Me.m_strName = strName
    End Sub

    Public ReadOnly Property Code() As String
        Get
            Return m_strCode
        End Get
    End Property

    Public ReadOnly Property FruitName() As String
        Get
            Return m_strName
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return Me.Code + " - " + Me.FruitName
    End Function
End Class

Items.Addで追加する

ComboBox1.BeginUpdate()
ComboBox1.Items.Add(New Fruit("0001", "リンゴ"))
ComboBox1.Items.Add(New Fruit("0002", "みかん"))
ComboBox1.Items.Add(New Fruit("0003", "いちご"))
ComboBox1.EndUpdate()

ComboBox1.SelectedIndex = ComboBox1.FindStringExact("みかん")

ComboBox1.DisplayMember = "FruitName"

---------------------------------------------------------------------------------

[値を取得するときの処理]
Dim no As Integer = ComboBox1.SelectedIndex
Dim strTemp As Fruit = Me.ComboBox1.SelectedItem

※BeginUpdate()とEndUpdate()は普通いりません。(再描画しないようにする機能です)

DataSourceで追加する

Dim Fruits As New ArrayList()
Fruits.Add(New Fruit("0001", "リンゴ"))
Fruits.Add(New Fruit("0002", "みかん"))
Fruits.Add(New Fruit("0003", "いちご"))

ComboBox1.DataSource = Fruits
ComboBox1.DisplayMember = "FruitName"
ComboBox1.ValueMember = "Code"

---------------------------------------------------------------------------------

[値を取得するときの処理]
Dim no As Integer = ComboBox1.SelectedIndex
Dim strTemp As Fruit = Me.ComboBox1.SelectedItem
Dim strVal As String = ComboBox1.SelectedValue.ToString()

ComboBoxにEnumで列挙した値を設定する

Enum Fruit As Integer
    リンゴ = 10
    みかん = 20
    いちご = 30
End Enum

--------------------------------------------------------------------
[列挙体をComboBoxに設定する]

ComboBox1.DataSource = System.Enum.GetValues(GetType(Fruit))

--------------------------------------------------------------------
[選択された値を所得する]

Dim no As Integer = ComboBox1.SelectedValue

 

VB.NETテキストボックス(TextBox)

TextBoxで入力制御の例を説明します。

仕様説明

・[↑][↓]は前・次のコントロールに移動する

・[TAB]は機能しない

・[ESC]は入力初期値に戻す

・確定は[Enter]とする

・マウス移動は入力キャンセルとする

・セットフォーカスは全選択とする

金額入力の例

Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter
    DirectCast(sender, TextBox).ClearUndo()
    DirectCast(sender, TextBox).SelectAll()
End Sub

Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
    DirectCast(sender, TextBox).Undo()
End Sub

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    If e.KeyChar = ControlChars.Back Then
        Return
    End If

    If Not Char.IsDigit(e.KeyChar) Then
        e.Handled = True
    End If

    Dim s As String = StrConv(e.KeyChar, VbStrConv.Narrow)
    e.KeyChar = s(0)
End Sub

Private Sub TextBox1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles TextBox1.PreviewKeyDown
    Select Case e.KeyCode
        Case Keys.Up
            Me.ProcessTabKey(False)
        Case Keys.Down
            Me.ProcessTabKey(True)
        Case Keys.Tab
            e.IsInputKey = True
        Case Keys.Escape
            DirectCast(sender, TextBox).Undo()
            DirectCast(sender, TextBox).ClearUndo()
        Case Keys.Enter
            Dim val As Integer
            Dim bc As Boolean = Integer.TryParse(DirectCast(sender, TextBox).Text,
                                                 System.Globalization.NumberStyles.Number,
                                                 System.Globalization.CultureInfo.InvariantCulture, val)

            DirectCast(sender, TextBox).Text = val.ToString("#,0")
            DirectCast(sender, TextBox).ClearUndo()
            Me.ProcessTabKey(True)
            e.IsInputKey = True
    End Select
End Sub

実数入力例

Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter
    DirectCast(sender, TextBox).ClearUndo()
    DirectCast(sender, TextBox).SelectAll()
End Sub

Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
    DirectCast(sender, TextBox).Undo()
End Sub

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    If e.KeyChar = ControlChars.Back Then
        Return
    End If

    Dim s As String = StrConv(e.KeyChar, VbStrConv.Narrow)
    If Not Char.IsDigit(e.KeyChar) And s <> "." Then
        e.Handled = True
    End If

    e.KeyChar = s(0)
End Sub

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    Select Case e.KeyCode
        Case Keys.Up
            Me.ProcessTabKey(False)
        Case Keys.Down
            Me.ProcessTabKey(True)
        Case Keys.Tab
            e.Handled = False
        Case Keys.Escape
            DirectCast(sender, TextBox).Undo()
            DirectCast(sender, TextBox).ClearUndo()
        Case Keys.Enter
            Dim val As Decimal
            Dim bc As Boolean = Decimal.TryParse(DirectCast(sender, TextBox).Text,
                                             System.Globalization.NumberStyles.Number,
                                             System.Globalization.CultureInfo.InvariantCulture, val)

            DirectCast(sender, TextBox).Text = val.ToString("#,0.00")
            DirectCast(sender, TextBox).ClearUndo()
            Me.ProcessTabKey(True)
            e.Handled = False
    End Select
End Sub

日付入力例

Private Sub TextBox2_Enter(sender As Object, e As EventArgs) Handles TextBox2.Enter
    DirectCast(sender, TextBox).ClearUndo()
    DirectCast(sender, TextBox).SelectAll()
End Sub

Private Sub TextBox2_Leave(sender As Object, e As EventArgs) Handles TextBox2.Leave
    DirectCast(sender, TextBox).Undo()
End Sub

Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
    If e.KeyChar = ControlChars.Back Then
        Return
    End If

    Dim s As String = StrConv(e.KeyChar, VbStrConv.Narrow)

    If Not Char.IsDigit(s(0)) And s <> "/" Then
        e.Handled = True
    End If

    e.KeyChar = s(0)
End Sub

Private Sub TextBox2_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles TextBox2.PreviewKeyDown
    Select Case e.KeyCode
        Case Keys.Up
            Me.ProcessTabKey(False)
        Case Keys.Down
            Me.ProcessTabKey(True)
        Case Keys.Tab
            e.IsInputKey = True
        Case Keys.Escape
            DirectCast(sender, TextBox).Undo()
            DirectCast(sender, TextBox).ClearUndo()
        Case Keys.Enter
            Dim s As String = DirectCast(sender, TextBox).Text

            Dim val As Integer
            If Integer.TryParse(s, System.Globalization.NumberStyles.Number,
                                   System.Globalization.CultureInfo.InvariantCulture, val) Then
                s = Format(val, "####/00/00")
            End If

            Dim dt As DateTime
            If Not DateTime.TryParse(s, New System.Globalization.CultureInfo("ja-JP"),
                                        System.Globalization.DateTimeStyles.AssumeLocal, dt) Then
                Return
            End If

            DirectCast(sender, TextBox).Text = dt.ToString("yyyy/MM/dd")

            DirectCast(sender, TextBox).ClearUndo()
            Me.ProcessTabKey(True)
            e.IsInputKey = True
    End Select
End Sub

※上記の例では、クリップボードの制御をしていません。

・上記の例ではKeyDownとPreviewKeyDownを使用していますが、通常KeyDownでよいようです。PreviewKeyDownはButtonなどの時に使用します。