C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ユーザーコントロールに追加したコントロールのイベントについて


(過去ログ 103 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■61753 / inTopicNo.1)  ユーザーコントロールに追加したコントロールのイベントについて
  
□投稿者/ だんご (1回)-(2011/09/02(Fri) 10:24:40)

分類:[.NET 全般] 

2011/09/02(Fri) 10:59:06 編集(投稿者)
2011/09/02(Fri) 10:58:38 編集(投稿者)
2011/09/02(Fri) 10:58:35 編集(投稿者)

<pre><pre>VB.NET2008+WINDOWSフォーム

Labelを3つ貼り付けているユーザーコントロールを作成し
そのユーザーコントロールをFromで使用しているのですが

MouseMoveイベントを利用するにあたって
貼り付けているLabelの部分のイベントが発生せずに困っています
Labelの無い部分は、ユーザーコントロールのイベントが発生するので問題ありません

┌────────┐
│Label1          │
├────────┤
│Label2          │
├────────┤
│Label3          │
├────────┤
│□□□□□□□□│
└────────┘
□の部分のMouseMoveはイベントが発生するが
Label1〜3の部分はイベントが起きません


例えばユーザーコントロールに2つのボタンを追加しているような場合も
From上に貼り付けた場合のClickイベントは1つだと思うのですが
2つのボタンのClickイベントを拾いたい場合はどう定義すべきなのでしょうか?

</pre></pre>

引用返信 編集キー/
■61755 / inTopicNo.2)  Re[1]: ユーザーコントロールに追加したコントロールのイベントについて
□投稿者/ shu (968回)-(2011/09/02(Fri) 11:01:51)
2011/09/02(Fri) 12:22:46 編集(投稿者)
2011/09/02(Fri) 11:02:04 編集(投稿者)

■No61753 (だんご さん) に返信

Public Class UserControl1
    Public Event Click1 As EventHandler
    Public Event Click2 As EventHandler

    Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
        RaiseEvent Click1(Me, EventArgs.Empty)
    End Sub

    Private Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
        RaiseEvent Click2(Me, EventArgs.Empty)
    End Sub

End Class

こんな感じでUserControlにイベントを追加する必要があります。

# 両方Click1になっていたのを修正しました。

引用返信 編集キー/
■61756 / inTopicNo.3)  Re[1]: ユーザーコントロールに追加したコントロールのイベントについて
□投稿者/ 魔界の仮面弁士 (2344回)-(2011/09/02(Fri) 11:29:57)
No61753 (だんご さん) に返信
> そのユーザーコントロールをFromで使用しているのですが
> From上に貼り付けた場合のClickイベントは1つだと思うのですが
From → Form かな?


> Labelを3つ貼り付けているユーザーコントロールを作成し
> そのユーザーコントロールをFromで使用しているのですが
>
> 例えばユーザーコントロールに2つのボタンを追加しているような場合も
> From上に貼り付けた場合のClickイベントは1つだと思うのですが
> 2つのボタンのClickイベントを拾いたい場合はどう定義すべきなのでしょうか?
Label の MouseMove の話なのでしょうか。
Button の Click の話なのでしょうか。


> MouseMoveイベントを利用するにあたって
> 貼り付けているLabelの部分のイベントが発生せずに困っています
UserControl が、Label の MouseMove イベントを検出できないという話ですか?
それとも、MouseMove を Form 側で検出したいという話ですか?


> From上に貼り付けた場合のClickイベントは1つだと思うのですが
> 2つのボタンのClickイベントを拾いたい場合はどう定義すべきなのでしょうか?
幾つかの実装パターンがあります。

(1) FontDialog における [適用]ボタン(Apply イベント) と
 [ヘルプ]ボタン(HelpRequest イベント) のように、
 個々のボタンごとに、別々のイベントを用意する実装パターン。

(2) ToolStrip 上のボタンの Click イベントのように、個々の要素を
 そのまま公開し、各オブジェクトの Click イベントを利用する実装。

(3) CheckedListBox の ItemCheck イベントのように、どれが使われても
 同じイベントとして発生させ、イベント引数 e で要素判定させるパターン。



===========================
1 の実装例
---------------------------
Public Event OKClick As EventHandler
Public Event CancelClick As EventHandler

Private Sub Button1_Click() Handles Button1.Click
    RaiseEvent OKClick(Me, EventArgs.Empty)
End Sub

Private Sub Button2_Click() Handles Button2.Click
    RaiseEvent CancelClick(Me, EventArgs.Empty)
End Sub



===========================
2 の実装例
---------------------------
'デザイン時に、UserControl 上の各ボタンの Modifiers プロパティを
'Private にしておく
Public ReadOnly Property OKButton() As Button
    Get
        Return Me.Button1
    End Get
End Property

Public ReadOnly Property CancelButton() As Button
    Get
        Return Me.Button2
    End Get
End Property



===========================
3 の実装例
---------------------------
Private Sub Button1_Click() Handles Button1.Click
    RaiseEvent ButtonClick(Me, New ButtonClickEventArgs(0))
End Sub

Private Sub Button2_Click() Handles Button2.Click
    RaiseEvent ButtonClick(Me, New ButtonClickEventArgs(1))
End Sub

Public Event ButtonClick As EventHandler(Of ButtonClickEventArgs)

Public Class ButtonClickEventArgs
    Inherits EventArgs
    Private _Index As Integer
    Friend Sub New(ByVal Index As Integer)
        _Index = Index
    End Sub
    Public ReadOnly Property Index() As Integer
        Get
            Return _Index
        End Get
    End Property
End Class

引用返信 編集キー/
■61757 / inTopicNo.4)  Re[2]: ユーザーコントロールに追加したコントロールのイベントについて
□投稿者/ だんご (2回)-(2011/09/02(Fri) 13:01:16)
shuさん
ボタンのクリックイベントのご説明有難うございました。
ユーザーコントロール側にイベントを設定する必要性も理解出来ました


魔界の仮面弁士さん
ボタンのクリックイベントのご説明有難うございました
例文まで書いていただいて大変よく分かりました

質問を2つ書いてしまって紛らわしかったです、申し訳ありません
メインとなる質問はラベルのマウスイベントの方になります。

□やりたかった事
1.ラベルが複数配置された大きなラベルを画面上に複数配置し
2.配置した各ラベルをマウスのクリックで自由に動かしたい

上記のような事を行いたかったため
複数のラベルを持たせたユーザーコントロールを作成すれば良いと思い
3つのラベル(EX1,EX2,EX3)を貼り付けたユーザーコントロールを作りました
(*)上記のユーザーコントロールを[UC_LBL]とします

作成した[UC_LBL]をメインのForm上に貼り付けて
マウスイベントのUC_LBL_MouseDown、UC_LBL_MouseUp、UC_LBL_MouseMove
に移動させる処理を記述して動かしてみました

Ex1,Ex2,Ex3の無い所をクリックするとイベントが発生して動くのですが
貼り付けている3つのラベルの上でクリックしてもイベントが発生しませんでした
ユーザーコントロールとして作成した時点で
3つのラベルは1つのコントロールとして操作できる物と思っていました

┌────────┐
│Label_Ex1       │←ラベルの上では[UC_LBL]のイベントは起こらない
├────────┤
│Label_Ex2       │←ラベルの上では[UC_LBL]のイベントは起こらない
├────────┤
│Label_Ex3       │←ラベルの上では[UC_LBL]のイベントは起こらない
├────────┤
│□□□□□□□□│←何も無い部位で操作するとイベントが発生する
└────────┘

この大きなラベルの何処をクリックしても
1つのラベルとして動かしたい場合はユーザーコントロール側で
各Exのラベルにイベントを追加したりする必要があるという事でしょうか?

引用返信 編集キー/
■61759 / inTopicNo.5)  Re[3]: ユーザーコントロールに追加したコントロールのイベントについて
□投稿者/ shu (969回)-(2011/09/02(Fri) 13:47:27)
No61757 (だんご さん) に返信

>
> この大きなラベルの何処をクリックしても
> 1つのラベルとして動かしたい場合はユーザーコントロール側で
> 各Exのラベルにイベントを追加したりする必要があるという事でしょうか?
各々のイベントを追加する必要があります。
ただし、例えばClickイベントで同じ処理をするなら

Private Sub Ctl_Click(sender As System.Object, e As System.EventArgs) Handles MyBase.Click, Label1.Click, Label2.Click, Label3.Click

End Sub

のようにHandlesの後ろに列挙するだけでいいです。
MouseDown,Up,Moveでも同様の事が可能です。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -