前提・実現したいこと
VB.NETで自作のカレンダーを作成しています。
BtnPrevMonthを押すと1か月前のカレンダーを表示させるのですが、その際にVisibleChangeのイベントを発動させたいです。
発生している問題・エラーメッセージ
VisibleChangeイベントが発動しない。
該当のソースコード
VB
1VisibleChangeイベントはAddHandlerで発動させています。 2 3 Private Sub Addlabel1DayToF1Day(ByVal startDayAtF1Number As Integer, ByVal totalDaysInMonth As Integer) 4 For Each f1 As Button In listF1Day 5 f1.Controls.Clear() 6 Next 7 '//1日から月の最終日まで 8 For i As Integer = 1 To totalDaysInMonth 9 Dim lbl As New Label 10 lbl.Name = $"lblDay{i}" 11 lbl.AutoSize = False 12 lbl.TextAlign = ContentAlignment.TopLeft 13 lbl.Size = New Size(19, 18) 14 lbl.Tag = New Date(currentDate.Year, currentDate.Month, i) 15 lbl.Text = i 16 lbl.Font = New Font("Microsoft Sans Serif", 8) 17 listF1Day((i - 1) + (startDayAtF1Number - 1)).Controls.Add(lbl) 18 'listF1Day((i)).BackColor = SystemColors.Control 19 listF1Day((i - 1) + (startDayAtF1Number - 1)).Tag = New Date(currentDate.Year, currentDate.Month, i) 'パネルのTagプロパティに日付を入れる 20 21 '//選択中の日付パネル処理 22 If Not listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.Yellow And Not GNNO.Text = "" Then 23 listF1Day(New Date(currentDate.Year, currentDate.Month, 1).DayOfWeek + currentDate.Day - 1).BackColor = Color.Yellow '今日の日付パネルを取得 24 ElseIf listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.Yellow And GNNO.Text = "" Then 25 listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.White 26 'AddHandler lbl.Leave, AddressOf lbl_Leave 27 End If 28 AddHandler lbl.Enter, AddressOf lbl_Click 29 AddHandler lbl.Leave, AddressOf lbl_Leave 30 Next 31 If DateLabel.Text = Today Or Not DateLabel.Text = Today Then 32 '入力があれば日報データ表示 33 Me.DateValue() 34 Else 35 End If 36 37 End Sub
試したこと
補足情報(FW/ツールのバージョンなど)
VisualStudio2017,SQLServer
> VisibleChangeイベントはAddHandlerで発動させています。
発動してないんでしょう?
Load時には発動しています。
ボタンを押すと同じように発動させたいのですが、ボタンクリックでは発動しません。。
AddHandler はイベントの登録なので、「発動」が「イベントの発行」もしくは「イベントの処理」を示すならそこでは「発動」しません。
VisibleChanged はその名の通り Visible が変化したときに発行されます。
Visible 無関係に何か処理をしたいのであれば、その「したい処理」をメソッドとして独立させ、VisibleChanged の時、およびボタンクリックの時に呼び出せばいいでしょう。
Dim dayf = DirectCast(sender, Button)
Dim ClickDate As Date = dayf.Tag
Dim dread As SqlClient.SqlDataReader
Dim str As String = String.Empty
Try
Using conn As New SqlClient.SqlConnection(pubSqlConnectionString)
conn.Open()
Using cmd As New SqlClient.SqlCommand()
cmd.Connection = conn
cmd.CommandText =
"SELECT TGNSHIDUKE " & ControlChars.NewLine &
"FROM Gyomu_Body " & ControlChars.NewLine &
"WHERE TGNCRTTN = '" & CM0000.login_Pass & "' " & ControlChars.NewLine
dread = cmd.ExecuteReader()
Do While dread.Read()
Dim iIdx As Integer
Dim hiduke As String
iIdx = dread.GetOrdinal("TGNSHIDUKE")
hiduke = dread(iIdx)
If ClickDate.ToString("yyyy/MM/dd") = hiduke Then
dayf.BackColor = Color.Aquamarine
End If
Loop
End Using
End Using
Catch
End Try
こちらのsenderの部分で苦戦しております。
以上のソースの場合、メソッドとして独立させるにはどのようにすればよろしいでしょうか?
Button を引数とするメソッドを新しく作り、イベントハンドラの中で Sender を Button にキャストしてからそれを呼び出せばいいと思います。