🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VB.NET

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

Q&A

解決済

3回答

9458閲覧

VB.NET RaiseEventについて

Kruth

総合スコア13

VB.NET

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

0グッド

0クリップ

投稿2019/12/10 02:16

VisualStudio2019にて、Windowsアプリケーションを開発しています。
そこで、ユーザーコントロールの知識が必要になり勉強している最中です。

Get_Eventという名前でユーザーコントロールを作成し、テキストボックスを3つ置きました。
イメージ説明

Form1側にGet_EventとTextBox1を配置しました。
イメージ説明

Get_Event内のテキストボックスがFocusされた時にEventを発生し、
TextBox1にどのテキストボックスがFocusされているかとテキストボックスの内容をTextBox1に表示したいです。

VB.NET

1Public Event BoxClick(ByVal sender As Control, ByVal e As System.EventArgs) 2 3Private Sub cbox_Click(ByVal sender As Object, ByVal e As System.EventArgs) 4 RaiseEvent BoxClick(sender, e) 5End Sub

よろしくお願い申し上げます。

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

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

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

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

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

y_waiwai

2019/12/10 02:19

ききたいことはなんでしょうか
Kruth

2019/12/10 02:23

y_waiwaiさん わかりづらくてすみません TextBox1にどのテキストボックスがFocusされているかとテキストボックスの内容をTextBox1に表示するためにはどのように記載すればいいんでしょうか... Eventの順序すらわからない状態です。
guest

回答3

0

ベストアンサー

サンプル投下します。

ユーザーコントロールのコード

VB

1<System.ComponentModel.DefaultEvent("BoxClick")> 2Public Class Get_Event 3 4 Protected Overrides Sub OnLoad(e As EventArgs) 5 MyBase.OnLoad(e) 6 For Each ctrl As Control In Me.Controls 7 AddHandler ctrl.Enter, AddressOf ctrl_Enter 8 Next 9 End Sub 10 11 Private Sub ctrl_Enter(ByVal sender As Object, ByVal e As EventArgs) 12 RaiseEvent BoxClick(Me, New BoxClickEventArgs(DirectCast(sender, Control))) 13 End Sub 14 15 Public Event BoxClick(ByVal sender As Control, ByVal e As BoxClickEventArgs) 16 17End Class 18 19Public Class BoxClickEventArgs 20 Inherits EventArgs 21 22 Public ReadOnly Property Current As Control 23 24 Public Sub New(ctrl As Control) 25 Me.Current = ctrl 26 End Sub 27 28End Class

使い方

VB

1Public Class Form1 2 3 Private Sub Get_Event1_BoxClick(sender As Control, e As BoxClickEventArgs) Handles Get_Event1.BoxClick 4 TextBox1.Lines = New String() {"Focus:" & e.Current.Name, "Text :" & e.Current.Text} 5 End Sub 6 7End Class

投稿2019/12/10 05:05

KOZ6.0

総合スコア2707

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

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

Kruth

2019/12/10 05:38

回答ありがとうございます。 コピペして実行して動きを確認させていただきました。 完全にやりたかったことがこれです。 今後自分で機能を追加していったりしたいのですが、何を勉強したらいいんでしょうか? よければ教えていただけませんか?
KOZ6.0

2019/12/10 06:08

何を?って難しいですね・・・ とりあえず dobon さんのサイトに載っているサンプルを片っ端から読み漁ってみるのはどうでしょう。 http://dobon.net/vb/dotnet/ やりたいことは、たいてい載っているんじゃないかと思います。
Kruth

2019/12/10 06:30

ありがとうございます。 記載いただいたサイト拝見してみます。 どこでEventをキャッチして、どのようにして値を返してるのかが全然掴めません。 もし、お手すきでしたらそちらの解説をいただけたら幸いです。 また、ベストアンサーに選んでしまうとやり取りは出来なくなりますか?
KOZ6.0

2019/12/10 06:49

少し難しいこと、トリッキーな事をしたりしていれば解説しますが、このサンプルはそうではありません。 OnLoad って何?とか AddHandler って何?とかは、すべて Microsoft のサイトを調べればわかります。 そういうのを調べるのも勉強のうちですよ。
Kruth

2019/12/10 06:51

わからない行を全て調べて学んでみます。 またわからなければ質問させてください。 本当にありがとうございました。
Kruth

2019/12/10 08:19

すみません、記載いただいたコードの意味がだいぶわかってきました。 そこで1つ疑問な点があるんですが、なんでわざわざctrl_EnterをEnterイベントに追加してるんですか? BoxClickを追加したらもっとわかりやすいと思ったんですが、引数の型が変わるから段階を踏んでるイメージですか?
Kruth

2019/12/10 08:23

ctrl_EnterはあくまでCurrentにコントロールを記憶するためのものって考えたらいいんですかね...ぼんやりとわけてる理由はわかるんですが、正確にはわからないです...。
YAmaGNZ

2019/12/10 08:36

TextBoxがフォーカスを得る→Enterイベントが発生する→ユーザーコントロールからフォームへ通知する必要があるのでBoxClickを発生させる という順番です。 「記述を分けている」というわけではありません。 BoxClickイベントは自分で作成したイベントなので自分で発生させる(RaiseEventを呼ぶ)必要があります。
Kruth

2019/12/10 08:53

すみません、 ユーザーコントロールからフォームへ通知する必要があるのでBoxClickを発生させる この部分がよくわかりません...。 BoxClickを自分で呼ぶ必要性もわかりました。 Form1で ) Handles Get_Event1.BoxClick BoxClickを追加している意味があまりわかってないみたいです...。
Kruth

2019/12/11 01:51

読みました。 そこで BoxClickEventArgs をクラスで定義する意味はなんででしょうか? EventArgsの意味があまりわかってないので調べているんですが、自作のEventArgsについて 書かれている記事が全然なく困ってます。
YAmaGNZ

2019/12/11 02:18

イベントの引数はイベントが発生したオブジェクト(sender)とそのイベントの付属データを格納するもの(EventArgs)としましょうというのがC#やVB.NETの一般的なルールとなっています。 自分で作成するイベントの場合、独自の必要なデータを渡したい(今回の場合ですと、フォーカスを持っているテキストボックスのNameやText)というのが出てきます。 そういったデータは標準のEventArgsには定義されていませんので自分でそういったデータを格納するものを作らなければなりません。 それがBoxClickEventArgsです。 このデータを渡すためのクラスの名称にも○○EventArgsとしましょうというルールがあります。 こういったルールに則っていれば、他人が見たときでもBoxClickEventArgsはBoxClickイベントで引数になるクラスなんだということがひと目で分かり、理解しやすくなります。 こうしなければならないという「文法」ではありませんので、このルールに従わなくても作成はできます。 ですが、ルールに従ったコーディングを行えば、誰が見ても分かりやすいコードになります。
Kruth

2019/12/11 05:36

YAmaGNZさん TextBox1.TextのTextだったりは既にEventArgsでコーディングされているから いつでもその値を引き出せるっていうことですか・・・? KOZ6.0さん イベントの作成は全て拝見させていただきました。 YAmaGNZさんの解説をあわせて7割くらいは理解できたかなと思います。 お二人方大変ご丁寧にご教授いただきありがとうございました。
Kruth

2019/12/11 06:18

RaiseEvent BoxClick(Me, New BoxClickEventArgs(DirectCast(sender, Control))) この行で毎回新しい EventArgsが作成されて BoxClickEventArgsのCurrentにコントロールが保管される 認識はあってますか...?
YAmaGNZ

2019/12/11 06:37

そのような認識であっています。 Dim args As BoxClickEventArgs Dim textbox As Control textbox = DirectCast(sender, Control) args = New BoxClickEventArgs(textbox) RaiseEvent BoxClick(Me, args) と分解して書いたほうが分かりやすいですかね?
Kruth

2019/12/11 06:52

なるほどです。 すごく理解できました。 分解コードもありがとうございます。 この知識を定着できるように似たようなサンプルを何個か作成してみます。 本当にありがとうございました。 また機会がありましたら、ご回答よろしくお願いします。
guest

0

コンポーネントがフォーカスされた、アクティブコントロールになったときは、Enterイベントが発生します
そのときになんやかやすればいいでしょう

投稿2019/12/10 02:25

y_waiwai

総合スコア88038

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

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

Kruth

2019/12/10 02:29

Private Sub Get_Event_Enter(sender As Object, e As EventArgs) Handles Me.Enter End Sub ユーザーコントロールのEvent追加はこれであってますか...?
y_waiwai

2019/12/10 03:17 編集

VisualStudioでやってるなら、コントロールのプロパティでEnterイベントの欄をダブルクリックしたら作ってくれるでしょう
Kruth

2019/12/10 03:17

Eventは追加出来ました。 YAmaGNZさんの回答を待ってみます。
guest

0

イベントでのデータの渡し方が分からないということだと思いましたので、そちらに関して回答します。

VBNET

1Public Event BoxClick(ByVal sender As Control, ByVal e As BoxClickEventArgs) 2 3Public Class BoxClickEventArgs 4 Inherits EventArgs 5 6  Public ReadOnly Property Text As String 7 8 Public Sub New(text As String) 9 Me.Text = text 10 End Sub 11 12End Clas 13 14Private Sub cbox_Click(ByVal sender As Object, ByVal e As System.EventArgs) 15 Dim arg As New BoxClickEventArgs("渡すテキスト") 16 RaiseEvent BoxClick(Me, arg) 17End Sub

上記のように、イベントで渡すデータを格納するためのクラスを作成し、それを渡すようにすればよろしいかと思います。

単純に

VBNET

1Public Event BoxClick(TextBoxName As String,Text As String) 2 3Private Sub cbox_Click(ByVal sender As Object, ByVal e As System.EventArgs) 4 RaiseEvent BoxClick("TextBox名", "中身のテキスト") 5End Sub

という書き方もできます。
しかし、イベント定義の標準的なルールから外れる形になりますのであまりお勧めはしません。

投稿2019/12/10 02:32

編集2019/12/10 03:13
YAmaGNZ

総合スコア10469

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

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

Kruth

2019/12/10 02:41

ご回答ありがとうございます。 今やりたいことは、「ユーザーコントロールがFocusされた時にEventを発生させて、Form1のTextBox1にFocusされてるユーザーコントロール内のテキストボックス名とテキストボックス内容を取得したい」です。
YAmaGNZ

2019/12/10 02:47 編集

ですので、その発生させるイベントでテキストボックスの名前と内容を渡せるようにする方法が分からないと判断したのです。 違うのでしたら、分からないことを明確化して説明してください。
Kruth

2019/12/10 02:52

すみません、やりたいことはそのとおりです。 クラスを別にもう1つ作るってことですか...?
YAmaGNZ

2019/12/10 03:20

イベントの引数用のクラスを作らずに行うことも出来ますので、一応追記しましたが、一般的なルールから外れる形になりますのでお勧めはしません。 通常は最初に書いたように引数用のクラスを作成し~EventArgsという名称にします。
Kruth

2019/12/10 03:23

実際にForm1に記載するコードは特にないということでしょうか?
YAmaGNZ

2019/12/10 03:31

Form1にはそのイベントハンドラを書きます。 通常のコントロールのイベントと同様なので説明はしませんでした。 デザイナーでそのユーザーコントロールを配置したのであれば、デザイナー上でイベントハンドラの追加は行えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問