Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

Select文による 0 と Nothing の扱いについて 解決済み

タグの編集...

投稿者 HIRO   (その他)   投稿日時 2022/4/28 11:21:22
ものすごく基本的なことで過去の投稿でも見つけられず、質問させていただきました。

ComboBox で選択された値で処理を分岐させるため、Select 文で ComboBox.SelectedValue の値をみて処理を分けようとしています。

ComboBox には 「A」「B」という項目を画面初期化時に追加しています。
「A」が選択されたとき、ComboBox.SelectedValue の値は 0 、「B」が選択されたときは 1 になります。

何も選択しなかったとき、値は Nothing になることを確認したうえで、以下の様にSelect 文を記述したところ、「A」を選択したときと何も選択しなかったときと同じ処理が実行されてしまいました。

Select Case CoboBox.Selectedvalue
    Case 0 
        処理A
    Case 1
        処理B
  Case Else
        処理C
End Select

Case文では 0 と Nothing は区別できないのでしょうか?
CoboBox.SelectedIndex の値が -1 または CoboBox.Text がブランクかどうかで判断するしかないのでしょうか?

投稿者 るきお   (社会人)   投稿日時 2022/4/28 18:48:14
Windows フォーム アプリとして回答しますね。

>ComboBox には 「A」「B」という項目を画面初期化時に追加しています。
>「A」が選択されたとき、ComboBox.SelectedValue の値は 0 、「B」が選択されたときは 1 になります。
ComboBoxのItmes.AddItem で "A" と "B" を追加しているだけであれば、そのようにはなりません。
SelectedValue は選択されている"A"や"B"ではなく、ValueMemberプロパティで指定されているものを返すので、Nothing になります。
なので、これが 0 や 1 になるということは HIRO さんのプログラムでは、項目を追加するときに何かしているのだと思います。

それがわからないと試せないで何が起こっているのわかりません。

単純に回答すると
> Case文では 0 と Nothing は区別できないのでしょうか?
いいえ。できます。

>CoboBox.SelectedIndex の値が -1 または CoboBox.Text がブランクかどうかで判断するしかないのでしょうか?
何も選択されていないかの判断であれば、SelectedIndex が -1 で判断するのが良いと思います。

参考にシンプルな例を紹介します。
フォームに ComboBox1 と Button1 を貼り付けてお試しください。
最初 Button1 をクリックすると Nothing と表示されます。
ComboBox1で何か選択してからButton1をクリックするとAやBが表示されます。
この例では SelectedValue ではなく、SelectedItem を使用している点にもご注意ください。
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBox1.Items.Add("A")
        ComboBox1.Items.Add("B")
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Select Case ComboBox1.SelectedItem
            Case "A"
                MsgBox("A")
            Case "B"
                MsgBox("B")
            Case Nothing
                MsgBox("Nothing")
        End Select

    End Sub
End Class


投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/4/28 21:19:19
> Select Case CoboBox1.SelectedValue
Option Strict On の時に使えない書き方なので、あまりお奨めしません。

> Case文では 0 と Nothing は区別できないのでしょうか?
はい。言語仕様として、Select Case ~Case~End Select では区別できません。
仮に「Case Nothing」と書いても、「Case Is = Nothing」の意味になってしまうためです。


代用方法として、このような書き方ならできます。

Select Case If(ComboBox1.SelectedValue, Integer.MinValue)
    Case 0
        処理A
    Case 1
        処理B
    Case Integer.MinValue    'Nothing を別の値に置き換えて代用 
        処理C
    Case Else
        処理D
End Select



Select Case に指定できる値は、「プリミティブな型として評価可能な値」に限られます。
Case 句に指定される値は、「その値に対する = 演算子相当」の動作に限られます。

Nothing の区別には Is 演算子すなわち 「If X Is Nothing Then」相当の比較式が
必要ですが、それは Select Case では使えません。

「Case Is 比較演算子 X」を用いるコーディングにしても、この場合の比較演算子としては
=、<>、<、<=、>、>= のみが許可され、Is や IsNot はサポートされません。

「Case Is = 0」や「Case Is >= 0」や「Case Is <> 0」などとは書けますが、
「Case Is Is Nothing」や「Case Is IsNot Nothing」などとはできないということで。


Dim a As Object = Nothing
Dim b As Integer? = Nothing
Dim c As Integer = Nothing
Dim d As String = Nothing


「Select Case c」に対する「Case Nothing」と「Case 0」は同義です。
「Select Case d」に対する「Case Nothing」と「Case ""」も同義です。

投稿者 HIRO   (その他)   投稿日時 2022/4/30 09:08:31
るきお様、魔界の仮面弁士 様

回答ありがとうございます。
また、前提となる情報(画面初期化時の具体的な処理など)をきちんと提示せず、一方的に知りたいことだけを質問してしまい申し訳ありませんでした。次回質問をする際は気を付けます。