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