質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

5885閲覧

VB.NETで自作カレンダーを作成しています。Leaveイベントが発生しないため、解決策を教えて戴きたく思います。

yurika_21

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/07/29 23:27

前提・実現したいこと

VB.NETで自作のカレンダーを作成しています。
日にちを格納しているパネルに対してクリックイベントは発生させることは出来ているのですが、Leaveイベントが発生しないため、困っております。

クリックイベントでクリックしてパネルの背景色を変えているのですが、Leaveイベントでクリックしているパネル以外の背景色は白にしたいです。
現在は、クリックしたパネルの背景色が変わったままで残ってしまっている状態です。

発生している問題・エラーメッセージ

クリックイベントで変えている背景色を白に戻したいが、Leaveイベントが発生しないため、クリックしたパネルの背景色が変わったまま残っています。

該当のソースコード

VB

1こちらはカレンダーを生成しているソースになります。 2'************************************************** 3 'カレンダーの今日の日付を取得 4 '************************************************* 5 Private listF1Day As New List(Of FlowLayoutPanel) 6 Private currentDate As DateTime = DateTime.Today 7 8 '************************************************** 9 '月の始まりの日を取得 10 '************************************************* 11 Private Function GetFirstDayOfWeekOfCurrentDate() As Integer 12 Dim firstDayOfMonth As DateTime = New Date(currentDate.Year, currentDate.Month, 1) 13 Return firstDayOfMonth.DayOfWeek + 1 14 End Function 15 '************************************************** 16 '月の最終日を取得 17 '************************************************* 18 Private Function GetTotalDaysOfCurrentDate() As Integer 19 Dim firstDayOfCurrentDate As DateTime = New Date(currentDate.Year, currentDate.Month, 1) 20 Return firstDayOfCurrentDate.AddMonths(1).AddDays(-1).Day 21 End Function 22 '************************************************** 23 'DateLabelの表示形式を指定 24 '************************************************* 25 Private Sub DisplayCurrentDate() 26 DateLabel.Text = currentDate.ToString("yyyy/MM/dd") 27 Addlabel1DayToF1Day(GetFirstDayOfWeekOfCurrentDate(), GetTotalDaysOfCurrentDate()) 28 End Sub 29 '************************************************** 30 '各ボタン(月、日)設定 31 '************************************************* 32 Private Sub PrevMonth() 33 currentDate = currentDate.AddMonths(-1) 34 DisplayCurrentDate() 35 End Sub 36 37 Private Sub NextMonth() 38 currentDate = currentDate.AddMonths(1) 39 DisplayCurrentDate() 40 End Sub 41 42 Private Sub ToMonth() 43 currentDate = DateTime.Today 44 DisplayCurrentDate() 45 End Sub 46 47 Private Sub PrevDay() 48 currentDate = currentDate.AddDays(-1) 49 DisplayCurrentDate() 50 End Sub 51 52 Private Sub NextDay() 53 currentDate = currentDate.AddDays(1) 54 DisplayCurrentDate() 55 End Sub 56 '************************************************** 57 'カレンダー内の日付Panelを生成 58 '************************************************* 59 Private Sub GenerateDayPanel(ByVal totalDays As Integer) 60 f1Days.Controls.Clear() 61 listF1Day.Clear() 62 For i As Integer = 1 To totalDays 'f1=パネル一枚一枚の設定 63 Dim f1 As New FlowLayoutPanel 64 f1.Name = $"f1Day{i}" 65 f1.Size = New Size(46, 23) 66 f1.BackColor = Color.White 67 f1Days.Controls.Add(f1) 68 f1.BorderStyle = BorderStyle.FixedSingle 69 f1.Cursor = System.Windows.Forms.Cursors.Hand 70 listF1Day.Add(f1) 71 72 'AddHandler f1.Validated, AddressOf f1_Leave 73 AddHandler f1.Click, AddressOf Day_Click 74 75 Next 76 End Sub 77 Event sample() 78 Sub f1_Leave() 79 80 MsgBox("1") 81 End Sub 82 '************************************************** 83 'カレンダー内のPanelクリック時イベント 84 '************************************************* 85 Private Sub Day_Click(sender As Object, e As EventArgs) 86 87 'クリックされたオブジェクトをFlowLayoutPanel型にキャストする 88 Dim dayf = CType(sender, FlowLayoutPanel) 89 Dim ClickDate As Date = dayf.Tag 90 DateLabel.Text = ($"{ClickDate.ToString("yyyy/MM/dd")}") 91 92 93 dayf.BackColor = Color.Yellow 94 If DateLabel.Text = Today Or Not DateLabel.Text = Today Then 95 '入力があれば日報データ表示 96 Me.DateValue() 97 Else 98 End If 99 End Sub 100 101 102 103 104 105 '************************************************** 106 'カレンダー内のPanelに日付のLabelを生成 107 '************************************************* 108 Private Sub Addlabel1DayToF1Day(ByVal startDayAtF1Number As Integer, ByVal totalDaysInMonth As Integer) 109 For Each f1 As FlowLayoutPanel In listF1Day 110 f1.Controls.Clear() 111 Next 112 '//1日から月の最終日まで 113 For i As Integer = 1 To totalDaysInMonth 114 Dim lbl As New Label 115 lbl.Name = $"lblDay{i}" 116 lbl.AutoSize = False 117 lbl.TextAlign = ContentAlignment.TopLeft 118 lbl.Size = New Size(19, 18) 119 lbl.Tag = New Date(currentDate.Year, currentDate.Month, i) 120 'lbl.BackColor = SystemColors.Control 121 lbl.Text = i 122 lbl.Font = New Font("Microsoft Sans Serif", 8) 123 listF1Day((i - 1) + (startDayAtF1Number - 1)).Controls.Add(lbl) 124 'listF1Day((i)).BackColor = SystemColors.Control 125 listF1Day((i - 1) + (startDayAtF1Number - 1)).Tag = New Date(currentDate.Year, currentDate.Month, i) 'パネルのTagプロパティに日付を入れる 126 127 '//選択中の日付パネル処理 128 If Not listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.Yellow Then 129 listF1Day(New Date(currentDate.Year, currentDate.Month, 1).DayOfWeek + currentDate.Day - 1).BackColor = Color.Yellow '今日の日付パネルを取得 130 ElseIf listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.Yellow Then 131 listF1Day((i - 1) + (startDayAtF1Number - 1)).BackColor = Color.White 132 listF1Day(New Date(currentDate.Year, currentDate.Month, 1).DayOfWeek + currentDate.Day - 1).BackColor = Color.Yellow '今日の日付パネルを取得 133 End If 134 AddHandler lbl.Click, AddressOf lbl_Click 135 136 Next 137 If DateLabel.Text = Today Or Not DateLabel.Text = Today Then 138 '入力があれば日報データ表示 139 Me.DateValue() 140 141 Else 142 End If 143 144 End Sub 145 146 '************************************************** 147 'カレンダー内のLabelクリック時イベント 148 '************************************************* 149 Private Sub lbl_Click(sender As Object, e As EventArgs) 150 Dim day = DirectCast(sender, Label) 151 Dim ClickDate As Date = day.Tag 152 DateLabel.Text = ($"{ClickDate.ToString("yyyy/MM/dd")}") 153 If DateLabel.Text = Today Or Not DateLabel.Text = Today Then 154 '入力があれば日報データ表示 155 Me.DateValue() 156 157 Else 158 End If 159 End Sub 160 '************************************************** 161 '各ボタン(月)のイベント 162 '************************************************* 163 Private Sub btnPrevMonth_Click(sender As Object, e As EventArgs) Handles BtnPrevMonth.Click 164 PrevMonth() 165 End Sub 166 167 Private Sub btnNextMonth_Click(sender As Object, e As EventArgs) Handles BtnNextMonth.Click 168 NextMonth() 169 End Sub 170 171 Private Sub btnToday_Click(sender As Object, e As EventArgs) Handles BtnToday.Click 172 ToMonth() 173 End Sub

試したこと

ValidatedやValidatingを試しましたが、イベントは発生しませんでした。

補足情報(FW/ツールのバージョンなど)

VisualStudio2017,SQLServer

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Leave イベントが発生しないのはradianさんの仰るとおりです。
対応として

1.現在対象のパネルを覚えておく変数を作成
2.パネルクリックイベントにて
2-1.1の変数のパネルを元に戻す
2-2.クリックされたパネルの色を変える
2-3.1の変数にクリックされたパネルを格納する

といった処理にしてはどうでしょうか?

投稿2020/07/30 00:35

YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yurika_21

2020/07/30 00:44

ありがとうございます! radianさんとYAmaGNZさんの方法共に試してみます! 本当に助かります!
guest

0

ベストアンサー

Panelはフォーカスを取得できないから Enter,Leave イベントが発生しないんだと思います。(内部にフォーカス可能なコントロールを含んでいる場合は除く)
Panelではなく、Button等で代用してみてはどうでしょう。

投稿2020/07/30 00:26

編集2020/07/30 00:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yurika_21

2020/07/30 00:34

ありがとうございます! PanelをButtonに代用するとしたらFlowLayoutPanelをButtonに変更すればよいのでしょうか?
退会済みユーザー

退会済みユーザー

2020/07/30 00:42 編集

質問文にカレンダーの構造も追記してもらえるとこちらも答えやすいです。 +FlowLayoutPanel(カレンダー本体) └Panel(日付) という構造なら、日付のPanelをButtonにする感じです。
退会済みユーザー

退会済みユーザー

2020/07/30 00:45

ちょっと勘違いしてました、ソース見るとFlowLayoutPanelに日付を格納してるのですね。 それならFlowLayoutPanelをButtonに変更でいいと思います。
yurika_21

2020/07/30 00:45

ありがとうございます! Buttonにしてみたところ思っていた動作を確認することが出来ました! 本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問