DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Form Close時のRadioButton.clickiイベントの発生について

環境/言語:[Windows2000Pro、Vb.net2002]
分類:[.NET]

2003/12/03(Wed) 18:07:34 編集(投稿者)

VB6からVB.Netへ移行中の.net初心者です。

FormにRadioButtonとbuttonを配置し
RadioButtonのクリックイベントを記述し、buttonのクリックイベントでMe.close()と記述すると、buttonをクリックしたときになぜかRadioButtonのクリックイベントが発生します。

デバッグをかけるとMe.closeの直前でRadioButtonのクリックイベントが発生していますが、
RadioButtonのクリックイベントが発生する原因がわかりません。
しかし、RadioButtonをクリックしないで起動直後にButtonをクリックするとRadioButtonのクリックイベントは発生しません。
ひょっとして、そういうものなのでしょうか?

環境はWindows2000Pro、Vb.net2002、
.NET Framework 1.1(version 1.1.4322.573)を使用しています。

どなたかわかる方、どうぞよろしくお願いします。

【ソース】
Option Strict On
Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。

End Sub

' Form は dispose をオーバーライドしてコンポーネント一覧を消去します。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
' Windows フォーム デザイナを使って変更してください。
' コード エディタは使用しないでください。
Friend WithEvents RadioButton1 As System.Windows.Forms.RadioButton
Friend WithEvents RadioButton2 As System.Windows.Forms.RadioButton
Friend WithEvents RadioButton3 As System.Windows.Forms.RadioButton
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.RadioButton1 = New System.Windows.Forms.RadioButton()
Me.RadioButton2 = New System.Windows.Forms.RadioButton()
Me.RadioButton3 = New System.Windows.Forms.RadioButton()
Me.Button1 = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'RadioButton1
'
Me.RadioButton1.Location = New System.Drawing.Point(16, 8)
Me.RadioButton1.Name = "RadioButton1"
Me.RadioButton1.Size = New System.Drawing.Size(104, 40)
Me.RadioButton1.TabIndex = 0
Me.RadioButton1.Text = "RadioButton1"
'
'RadioButton2
'
Me.RadioButton2.Location = New System.Drawing.Point(120, 8)
Me.RadioButton2.Name = "RadioButton2"
Me.RadioButton2.Size = New System.Drawing.Size(112, 40)
Me.RadioButton2.TabIndex = 1
Me.RadioButton2.Text = "RadioButton2"
'
'RadioButton3
'
Me.RadioButton3.Location = New System.Drawing.Point(232, 8)
Me.RadioButton3.Name = "RadioButton3"
Me.RadioButton3.Size = New System.Drawing.Size(120, 40)
Me.RadioButton3.TabIndex = 2
Me.RadioButton3.Text = "RadioButton3"
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(88, 56)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(176, 48)
Me.Button1.TabIndex = 3
Me.Button1.Text = "Button1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(368, 109)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.RadioButton3, Me.RadioButton2, Me.RadioButton1})
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region


Private Sub RadioButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click
Dim a As RadioButton
a = CType(sender, RadioButton)
MessageBox.Show(a.Name)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub

End Class
> FormにRadioButtonとbuttonを配置し
> RadioButtonのクリックイベントを記述し、buttonのクリックイベントでMe.close()と記述すると、buttonをクリックしたときになぜかRadioButtonのクリックイベントが発生します。
>
> デバッグをかけるとMe.closeの直前でRadioButtonのクリックイベントが発生していますが、
> RadioButtonのクリックイベントが発生する原因がわかりません。
> しかし、RadioButtonをクリックしないで起動直後にButtonをクリックするとRadioButtonのクリックイベントは発生しません。

動作からするとButton1、RadioButton1、RadioButton2、RadioButton3が
一つのグループとみなされていて、そのため、Button1をClickすると、
その前に選択されていたラジオボタンが非選択状態になる変化のためにラジオボタンのClickイベントが発生しているような気がします。
Button1をClickした時点で選択されていたラジオボタンのClickイベントが発生していませんか?

また、RadioButton1〜3をGroupBoxやPanel上に配置した場合はどうでしょう。

> 環境はWindows2000Pro、Vb.net2002、
> .NET Framework 1.1(version 1.1.4322.573)を使用しています。

VB.NET2002では.NET Frameworkは1.0が使われます。
ver1.1が入っていても使えません(使われません)。
ぶ-さんのコードですが、私の環境(Win2000Pro, .NET Framework 1.1)ではRadioButtonのクリックイベントが発生するということは確認できませんでした。.NET Framework 1.0のみに起こることなのでしょうか。
こんにちは、ぶ-さん、管理人さん。ピラルクです。

Framework1.0(SP2含む)のバグっぽいですね。
1.0は、Formを破棄(Dispose)するときにForm起動時の
FocusOwnerにフォーカスを入れてしまっているです。
というより、Button1_Leaveイベントを含めて、Control
破棄にからむイベントが発生するようですね。(≧∇≦)
(補:RadioButtonはCheckedになったものはTabStop=Trueになる)
それがButtonとかなら影響はありませんが、RadioButtonなら
毎回Click(選択)イベントまで走るので、ちょっと性質が悪いですね。

回避策は、
・RadioButtonをTabInex = 0にしない
(FocusLoopの先頭以外にして明示的に初回Focusを与える)
・Form_ClosingでRadioButtonのEnabledをFlaseにする
(GroupBoxに載せておけば1行で対処可能。
Me.Enabled=Falseは...どうなんだろう?
訂正されたFramework1.1の動作はこれに近いような感じが
するけど、影響度不明。(^^;)
・イベントが走っても問題ないようにRadioButton_Clickを書く
・Framework1.1を使う
 (Code上互換性ありなら構成ファイル(.config)配置で対処可能)
のいずれかで対処できかと思います。
よねKEN さん、管理人さん、ピラルクさん返信ありがとうございます。
返事遅くなりました。

よねKEN さんへ
>VB.NET2002では.NET Frameworkは1.0が使われます。
>ver1.1が入っていても使えません(使われません)。

恥かしながら全然知りませんでした。ご教授ありがとうございます。


■No1706に返信(ピラルクさんの記事)
> こんにちは、ぶ-さん、管理人さん。ピラルクです。
>
> Framework1.0(SP2含む)のバグっぽいですね。
> 1.0は、Formを破棄(Dispose)するときにForm起動時の
> FocusOwnerにフォーカスを入れてしまっているです。
> というより、Button1_Leaveイベントを含めて、Control
> 破棄にからむイベントが発生するようですね。(≧∇≦)
> (補:RadioButtonはCheckedになったものはTabStop=Trueになる)
> それがButtonとかなら影響はありませんが、RadioButtonなら
> 毎回Click(選択)イベントまで走るので、ちょっと性質が悪いですね。
>
> 回避策は、
> ・RadioButtonをTabInex = 0にしない
> (FocusLoopの先頭以外にして明示的に初回Focusを与える)
> ・Form_ClosingでRadioButtonのEnabledをFlaseにする
> (GroupBoxに載せておけば1行で対処可能。
> Me.Enabled=Falseは...どうなんだろう?
> 訂正されたFramework1.1の動作はこれに近いような感じが
> するけど、影響度不明。(^^;)
> ・イベントが走っても問題ないようにRadioButton_Clickを書く
> ・Framework1.1を使う
>  (Code上互換性ありなら構成ファイル(.config)配置で対処可能)
> のいずれかで対処できかと思います。
>

ピラルクさんへ
・RadioButtonをTabInex = 0にしない
・Form_ClosingでRadioButtonのEnabledをFlaseにする
で解決することができました!!助かりました。
本当にありがとうございます(^O^)
・Framework1.1を使う
は、やり方がわからずまだ実行していませんが、勉強して試してみたいです。
(とりあえず言語からはじめているので、Framework等よく理解していないので(^_^;)

RadioButtonをTabInex = 0にしたときとしないときでは、
動作が違うのにはびっくりです。
丁寧な原因と解決策に感謝いたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板