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

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

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

Re[4]: ユーザーコントロールを動的に配置した場合のイベント取得


(過去ログ 128 を表示中)

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

■76199 / inTopicNo.1)  ユーザーコントロールを動的に配置した場合のイベント取得
  
□投稿者/ しゃむこ (3回)-(2015/06/11(Thu) 15:53:54)

分類:[.NET 全般] 

2015/06/11(Thu) 15:57:11 編集(投稿者)
2015/06/11(Thu) 15:57:03 編集(投稿者)

.netframework 3.5
VB.NET
Visual Studio 2008

動的にユーザコントロールを複数個配置し、
そのユーザコントロール内のボタンをクリックした場合のイベントを、
1つのメソッドで処理しようとしています。

イベントの発生したコントロールを取得したいのですが、
senderオブジェクトにはユーザコントロール内に配置したボタンコントロールが格納されており、
イベントの発生したユーザコントロールが分からなく、困っています。何かよい方法はないでしょうか。

'ユーザコントロール
'Btn1を置いています。
Public Class UserControl1
 Public Event Btn1Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn1.Click
  RaiseEvent Btn1Click(sender, e)
 End Sub
End Class

'フォーム側
Public Class Form1
 Private Sub FrmMainGroupMst_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim Kensu As Integer = 99
  Dim UserControls() As UserControl1
  For i = 0 To Kensu - 1
   UserControls = New UserControl1(Kensu - 1) {}
   UserControls(i) = New UserControl1
   UserControls(i).Name = i
   UserControls(i).Location = New Point(50, 20 + i * 100)
   Me.pnl1.Controls.Add(UserControls(i))
   AddHandler UserControls(i).Btn1Click, AddressOf btnClick
  Next i
 End Sub
 
 Private Sub btnClick(ByVal sender As Object, ByVal e As MouseEventArgs)
  '★ここのsenderにbuttonが入っている。
  '★本当はUserContols(で何個目のユーザコントロールで発生したイベントか)を取得したい
  Dim c As UserControl1
  c = CType(sender, UserControl1)
  MessageBox.Show(c.Name)
 End Sub
End Class
引用返信 編集キー/
■76200 / inTopicNo.2)  Re[1]: ユーザーコントロールを動的に配置した場合のイベント取得
□投稿者/ ぽぴ王子 (29回)-(2015/06/11(Thu) 16:06:05)
ぽぴ王子 さんの Web サイト
No76199 (しゃむこ さん) に返信

> 'ユーザコントロール
> 'Btn1を置いています。
> Public Class UserControl1
>  Public Event Btn1Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
>  Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn1.Click
>   RaiseEvent Btn1Click(sender, e)
>  End Sub
> End Class

この部分を
>   RaiseEvent Btn1Click(Me, e)
にしてみたらどうでしょうか。

引用返信 編集キー/
■76201 / inTopicNo.3)  Re[2]: ユーザーコントロールを動的に配置した場合のイベント取得
□投稿者/ Hongliang (317回)-(2015/06/11(Thu) 16:16:12)
独自のEventArgsを作るとか。

Public Class ButtonClickEventArgs
	Inherits EventArgs
	Public Sub New(ByVal index As Integer)
		Me.m_index = index
	End Sub
	Public ReadOnly Property Index As Integer
		Get
			Return Me.m_index
		End Get
	End Property
	Private m_index As Integer
End Class

Public Class UserControl1
	Public Event BtnClick As EventHandler(Of ButtonClickEventArgs)
	Private Sub Btn1_Click(ByVal sender As Object, ByVal e As EventArgs)
		Dim index As Integer
		' 適当にindexを取得
		RaiseEvent BtnClick(sender, New ButtonClickEventArgs(index))
	End Sub
End Class

' Form側はe.Indexを参照する。

引用返信 編集キー/
■76205 / inTopicNo.4)  Re[3]: ユーザーコントロールを動的に配置した場合のイベント取得
□投稿者/ しゃむこ (4回)-(2015/06/11(Thu) 17:30:27)
ありがとうございます。
すみません、自己解決でした。普通の親子コントロールと同じですね、Control.Parentプロパティで親のUserControls1が取得できますね。。

> ぽぴ王子さん
なるほど、イベント、イベントプロシージャの引数を変えるという発想はありませんでした。
こちらでもできました。

> Hongliangさん
EventArgsを拡張してしまうんですね。
ユーザコントロール側で一意になるindexを最初から取得・保持しとく...もうちょい考えたら実装できそうです。

まだまだ初心者なんですが、いろいろ手段があって参考になります。
ありがとうございました。
引用返信 編集キー/
■76206 / inTopicNo.5)  Re[4]: ユーザーコントロールを動的に配置した場合のイベント取得
□投稿者/ しゃむこ (5回)-(2015/06/11(Thu) 17:31:07)
No76205 (しゃむこ さん) に返信
> ありがとうございます。
> すみません、自己解決でした。普通の親子コントロールと同じですね、Control.Parentプロパティで親のUserControls1が取得できますね。。
>
>>ぽぴ王子さん
> なるほど、イベント、イベントプロシージャの引数を変えるという発想はありませんでした。
> こちらでもできました。
>
>>Hongliangさん
> EventArgsを拡張してしまうんですね。
> ユーザコントロール側で一意になるindexを最初から取得・保持しとく...もうちょい考えたら実装できそうです。
>
> まだまだ初心者なんですが、いろいろ手段があって参考になります。
> ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -