いつもお世話になっております。
VB.NET で型名の比較について2点質問です。
フォームの初期化の場合に下記のようなコードで
コントロールに応じた初期化処理をしているのですが、
わざわざ文字列にしてそれを比較するのも余りスマートで
ないように見えまして、もう少しスマートな比較方法が
ないのかなと思うのですが、良い方法あるでしょうか?
Dim ctrl As System.Windows.Forms.Control
For Each ctrl In Me.Controls
Select Case ctrl.GetType().ToString
Case "System.Windows.Forms.TextBox"
ctrl.Text = ""
Case "System.Windows.Forms.ComboBox"
ctrl.Text = ""
CType(ctrl, System.Windows.Forms.ComboBox).Items.Clear()
Case "System.Windows.Forms.DateTimePicker"
CType(ctrl, System.Windows.Forms.DateTimePicker).Value = Now
Case "System.Windows.Forms.CheckBox"
CType(ctrl, System.Windows.Forms.CheckBox).Checked = False
End Select
Next
第二点は以下のようなイベントハンドラを考えるとして、sender には
System.Windows.Forms.Control の派生クラス(TextBox, CheckBoxなど)への参照が
渡されてくる予定のですが、渡されたものが本当にControlクラスの派生クラスなのか
を関数内で確認したいのです。どのようにしたら良いですか?
Private Sub Controls_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)
No.3ベストアンサー
- 回答日時:
#1です。
>senderは System.Objectなので
ふむふむ
>Addhandlerの設定によっては Control以外のクラスが来る可能性はあると思います。
そうですか?
受けで考えるのではなく、構造で考えた場合、キャストできないようなコントロールがもし存在していたら、イベントを発生ですら関連付けできないはずです。
関数の受けは確かにObjectですが、
>For Each l_objCtl In Me.Controls
で廻しているので、コントロールにキャスト可能なものしかイベントハンドラに関連付いてないと思うのですが。。。
Control 階層 (System.Windows.Forms)
http://www.microsoft.com/japan/msdn/library/defa …
このような各コントロールは、Controlへのキャストが可能です。
Control メンバ
http://www.microsoft.com/japan/msdn/library/defa …
キャストが可能であれば、コントロールが持っているイベントへの関連付けが可能だと思います。
どこかで
Call Controls_Enter(Nothing, New System.EventArgs)
とかで意図的に呼ばない限り、恐れている現象は発生しないと思います。
余談です。
Addhandlerでイベントを呼べるはずなのに、イベントが発生しないというのはあるかも知れません。。。
VB6時代によくサブクラス化を利用しておりましたが、VB側で発生させていないイベントが多々ありました。
そのVB魂を継承していたら、発生しないかもしれません。
No.2
- 回答日時:
if TypeOf(ctrl) Is System.Windows.Forms.TextBox then
...
ElseIf TypeOf(ctrl) Is System.Windows.Forms.ComboBox Then
...
ElseIf TypeOf(ctrl) Is System.Windows.Forms.DateTimePicker Then
...
End If
No.1
- 回答日時:
1.コントロール種別を得る
2.コントロール処理を判定
3.適した初期化処理を行う
これはVB6などではある手です。
.NETではあらかじめ、各種の初期化メソッドを同名で作成しておくで、判定を行う必要がなくなります。
質問2の意味がよくわかりませんでした。
>渡されたものが本当にControlクラスの派生クラス
逆に本物ではない物が来るのか知りたい^^;;
-----クラスを作成-----
Public Class cls初期化
'各種の初期化処理
Public Sub コントロール初期化(ByRef objCtl As ComboBox)
objCtl.Text = ""
objCtl.Items.Clear()
End Sub
Public Sub コントロール初期化(ByRef objCtl As DateTimePicker)
objCtl.Value = Now
End Sub
Public Sub コントロール初期化(ByRef objCtl As CheckBox)
objCtl.Checked = False
End Sub
'上記の初期化処理に存在しない場合は、ここに流れ着く
Public Sub コントロール初期化(ByRef objCtl As Control)
MsgBox(objCtl.Name.ToString & "(" & TypeName(objCtl) & ")は初期化対象外")
End Sub
End Class
-----以下をフォームに追加-----
'イベント/Load/フォーム
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim l_obj初期化 As New cls初期化()
Dim l_objCtl As Object
For Each l_objCtl In Me.Controls
'初期化を実行
Call l_obj初期化.コントロール初期化(l_objCtl)
'イベントを設定
AddHandler CType(l_objCtl, System.Windows.Forms.Control).Enter, AddressOf Me.Controls_Enter
Next
End Sub
'イベント/Enter/全てのコントロール
Private Sub Controls_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)
'フォーカスを得たコントロールを、フォームに表示
Me.Text = "[" & sender.name.ToString & "(" & TypeName(sender) & ")] にフォーカスがあります"
End Sub
ありがとうございます。
>逆に本物ではない物が来るのか知りたい^^;;
senderは System.Objectなので
Addhandlerの設定によっては Control以外の
クラスが来る可能性はあると思います。
無条件で CTypeでコントロールクラスにキャスト
していると、キャスト失敗で例外を投げることも
あり得るんじゃないかと思っているのですが。
コンパイルでチェックできないのが厄介です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- 英語 英文和訳についての質問です。 2 2023/06/23 06:38
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル・VBA CheckBoxのオブ...
-
もしフォームヘッダーにコント...
-
ExcelVBAでListViewが使用できない
-
ユーザーフォームで動的(Me.Con...
-
アクセス特有の書き方?
-
OCXって何ですか?
-
変数をコントロール型で使用す...
-
Excel VBA 動的に作成したチェ...
-
カメラスクロールするのを動画...
-
EXCELでactivexコントロールを...
-
コントロールを移動できない
-
間違えて配置してしまったコン...
-
真面目さをコントロールして無...
-
Shapeコントロールの.NET移行方法
-
DataGridView、1セルに複数コ...
-
Groupboxの配下のコントロール...
-
エクセル IEをコピーし貼り付け...
-
LCD 1602ディスプレイの輝度調...
-
コンボボックスの文字によるif...
-
C#で自分のウインド・ハンド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
vb.netで画面のコントロールId...
-
エクセルVBAでオプションボタン...
-
EXCELでactivexコントロールを...
-
ExcelVBAでListViewが使用できない
-
excelのリストボックスで選択し...
-
ユーザーフォームで動的(Me.Con...
-
フォーム上の現在アクティブな...
-
C#で自分のウインド・ハンド...
-
変数をコントロール型で使用す...
-
VBAのフォームでTextBoxがいっ...
-
コントロールを移動できない
-
Groupboxの配下のコントロール...
-
C#で角が丸いテキストボックス
-
(VBA)スピンボタンの大量...
-
間違えて配置してしまったコン...
-
エクセル コントロールツール...
-
'ckbl' コントロールは作成され...
-
OCXって何ですか?
おすすめ情報