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

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

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

Re[6]: 他のコントロールのイベントを代入


(過去ログ 18 を表示中)

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

■7200 / inTopicNo.1)  他のコントロールのイベントを代入
  
□投稿者/ Rita (1回)-(2007/08/31(Fri) 17:55:19)

分類:[VB.NET/VB2005] 

はじめまして。Delphiから引っ越してきたVB初心者です。

System.Windows.Form.Panelを使った、グリッドなるものを作成しております。
デザイナ上では1明細行のみがあり、そこへPGがコントロールを貼り付けプロパティを設定しイベントハンドラを記述し、実行するとデータ件数分Panelをコピーして複数明細行できる様なものを考えております。
そこで、動的にプロパティを含めてコピーはしたものの、コピー元からイベントハンドラまでは代入できません。

Delphiでは
TEdit(NewCtrl).OnEnter := TEdit(RefCtrl).OnEnter;
TEdit(NewCtrl).OnClick := TEdit(RefCtrl).OnClick;
と出来たものの・・

各コントローラ持つイベント別に関数へのポインタを持っているはずだと思いますが、どのようにすればコピー元のイベントを代入できるのでしょうか?

引用返信 編集キー/
■7202 / inTopicNo.2)  Re[1]: 他のコントロールのイベントを代入
□投稿者/ 囚人 (154回)-(2007/08/31(Fri) 18:18:13)
ん〜、無理ですね。
イベントに関数ポインタ(デリゲート)が関連付けられているとは限りませんし、デリゲートが一個とも限りませんし、さらにはそのクラス自身は管理していなくてコンテナが持っているかもしれないし…。
要は、イベントの実装は決まっていなくて、外部からはデリゲートを足すか引くかしかできません。

それより、そんな事をしたいという設計がおかしいような気がします。
引用返信 編集キー/
■7204 / inTopicNo.3)  Re[2]: 他のコントロールのイベントを代入
□投稿者/ Rita (3回)-(2007/08/31(Fri) 18:38:08)
No7202 (囚人 さん) に返信
> ん〜、無理ですね。
> イベントに関数ポインタ(デリゲート)が関連付けられているとは限りませんし、デリゲートが一個とも限りませんし、さらにはそのクラス自身は管理していなくてコンテナが持っているかもしれないし…。
> 要は、イベントの実装は決まっていなくて、外部からはデリゲートを足すか引くかしかできません。
やっぱり・・・ですか。
イベントハンドラを記述する際、コード上で↓↓↓
Private Sub MaskedTextBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MaskedTextBox1.Enter
って、コードからコントロールを参照している様です。

> それより、そんな事をしたいという設計がおかしいような気がします。
DBと連結した、n行一明細または、DataGridViewで利用できないコントロールの使用と動的に明細行を作成する事を目的としたユーザ・コントロールもどきが必要になったもので・・・

ところで、別の方法としてコピーする際、コピーした各コントロールにあらかじめイベントを登録して置き、そこからコピー元のイベントを実行させる方法を考えてみているのですが・・・
他のコントロールイベントを実行させる方法を教えてください。

CType(RefCtrl,MaskedTextBox).OnClick(sender,e)
の様な感じです。

重々、よろしくお願いいたします。
引用返信 編集キー/
■7206 / inTopicNo.4)  Re[3]: 他のコントロールのイベントを代入
□投稿者/ Jitta (411回)-(2007/08/31(Fri) 18:43:34)
AddHandler で調べておくんなもし。
引用返信 編集キー/
■7224 / inTopicNo.5)  Re[4]: 他のコントロールのイベントを代入
□投稿者/ Rita (4回)-(2007/09/01(Sat) 02:37:09)
2007/09/01(Sat) 02:52:04 編集(投稿者)
2007/09/01(Sat) 02:51:59 編集(投稿者)

No7206 (Jitta さん) に返信
> AddHandler で調べておくんなもし。

おそらく、コントロールをコピーするモジュール内であらかじめ
private sub RefCtrl_MaskedTextBox_Enter(・・・)
:  (前略)
CType(RefCtrl,MaskedTextBox).OnClick(sender,e) '<-ここが?なところ
end sub
として、
public sub CopyControlsOnPanel(・・・)
:  (前略)
Addhandler RefCtrl.Enter AddressOf RefCtrl_MaskedTextBox_Enter
end sub
という風に、一度モジュール内からコピー元のイベントへフックさせる感じになるかな?と思っております。
しかしながら、RefCtrl_MaskedTextBox_Enterにも問題継続してます・・・。

ただし、Reflectionを組合わせ技で行けそうな気がしますが、いかがでしょうか?

引用返信 編集キー/
■7225 / inTopicNo.6)  Re[5]: 他のコントロールのイベントを代入
□投稿者/ Jitta on the way (1回)-(2007/09/01(Sat) 09:17:16)
No7224 (Rita さん) に返信
> 2007/09/01(Sat) 02:52:04 編集(投稿者)
> 2007/09/01(Sat) 02:51:59 編集(投稿者)
>
> ■No7206 (Jitta さん) に返信
>>AddHandler で調べておくんなもし。
>
> おそらく、コントロールをコピーするモジュール内であらかじめ
> private sub RefCtrl_MaskedTextBox_Enter(・・・)
> :  (前略)
> CType(RefCtrl,MaskedTextBox).OnClick(sender,e) '<-ここが?なところ
> end sub
> として、
> public sub CopyControlsOnPanel(・・・)
> :  (前略)
> Addhandler RefCtrl.Enter AddressOf RefCtrl_MaskedTextBox_Enter
> end sub
> という風に、一度モジュール内からコピー元のイベントへフックさせる感じになるかな?と思っております。
> しかしながら、RefCtrl_MaskedTextBox_Enterにも問題継続してます・・・。
>
> ただし、Reflectionを組合わせ技で行けそうな気がしますが、いかがでしょうか?
>

え?リフレクションは必要ないでしょう。

囚人さんの通り、コピーは出来ないので、同じものを設定してください。C#のほうがわかりやすいと思う(Handlesがでてこないので)
引用返信 編集キー/
■7270 / inTopicNo.7)  Re[6]: 他のコントロールのイベントを代入
□投稿者/ Rita (5回)-(2007/09/03(Mon) 12:02:09)
2007/09/03(Mon) 12:04:47 編集(投稿者)

なんちゃってですが・・・、イベントコピーする事が出来ました。
以下、モジュールです。

Imports System.Reflection

''' <summary>
''' 参照先のコントロールに設定されたイベントをコントロールへ追加する
''' </summary>
''' <param name="target">コピー先のコントロール</param>
''' <param name="refCtrl">参照先のコントロール</param>
''' <param name="evName">イベントの種類("Click","Enter","Exit"..)</param>
''' <remarks>関数名は、"(コントロール名)_(イベント名)とすること"</remarks>
Public Sub Copy_EventHandler(ByVal target As Control, ByVal refCtrl As Control, ByVal evName As String)
On Error Resume Next

Dim ei As EventInfo = refCtrl.GetType.GetEvent(evName)
Dim miAddHandler As MethodInfo = ei.GetAddMethod()
Dim dl As [Delegate] = [Delegate].CreateDelegate( _
ei.EventHandlerType, _
Me, _
Me.GetType().GetMethod( _
refCtrl.Name + "_" + evName, _
BindingFlags.NonPublic Or BindingFlags.Instance _
) _
)
Dim addHandlerArgs() As Object = {dl}

miAddHandler.Invoke(target, addHandlerArgs)
End Sub

返答してくださった方々、有難うございました。</pre></pre>
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -