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

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

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

senderを自分で生成する方法

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

■85371 / inTopicNo.1)  senderを自分で生成する方法
  
□投稿者/ ぷるるん (1回)-(2017/10/16(Mon) 10:23:08)

分類:[.NET 全般] 

VB.NETで
フォーム上に



Private Sub DataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick

End Sub

というようなSubがありますが、
これらを別のSubで呼び出して使いたいと考えています。

普通は引数のsenderには実行したオブジェクトが自動で代入されるのですが
自分でそのオブジェクトを生成するにはどうしたら良いですか?

例えば

Call DataGridView1_CellDoubleClick(Form2.DataGridView1, nothing)

とやってみたのですが
呼び出したSub上で
sender.Nameなどの
名前を抽出することはできましたが
Form2.DataGridView1上のグラフデータを読み出そうとしたり
グラフにデータを書き込もうとしてエラーとなりうまくいきません

どうすれば良いでしょうか?


引用返信 編集キー/
■85372 / inTopicNo.2)  Re[1]: senderを自分で生成する方法
□投稿者/ Hongliang (571回)-(2017/10/16(Mon) 10:56:03)
2017/10/16(Mon) 10:57:20 編集(投稿者)
わざわざイベントハンドラを使いまわそうとしなくても、
新たにDataGridViewを引数に取るメソッドを定義すればいいのでは。

Private Sub DataGridView1_CellDoubleClick(...) Handles ...
    EditGraphData(Me.DataGridView1)
End Sub

' モジュールとかに定義
Sub EditGraphData(ByVal dgv As DataGridView)
    ' もともとDataGridView1_CellDoubleClickに書いてあった処理はこっちに移動
End Sub

// 引数にはDataGridViewそのものではなくそのデータソースを渡したほうが奇麗になりますが。

引用返信 編集キー/
■85373 / inTopicNo.3)  Re[2]: senderを自分で生成する方法
□投稿者/ ぷるるん (2回)-(2017/10/16(Mon) 11:17:13)
No85372 (Hongliang さん) に返信

ありがとうございます。

仰るとおり、それも一つの方法なのですが、
できれば、senderを自分で生成する方法も知りたいと思いました
よろしくお願いいたします。
 
引用返信 編集キー/
■85374 / inTopicNo.4)  Re[3]: senderを自分で生成する方法
□投稿者/ furu (124回)-(2017/10/16(Mon) 11:47:04)
No85373 (ぷるるん さん) に返信

Form2上のインスタンスを扱うなら

Call Form2.DataGridView1_CellDoubleClick(Form2.DataGridView1,nothing)

ではないですか?
引用返信 編集キー/
■85375 / inTopicNo.5)  Re[4]: senderを自分で生成する方法
□投稿者/ ぷるるん (3回)-(2017/10/16(Mon) 13:31:35)

すいません、少し質問が間違えていることに気がつきました

正確には


Private Sub DataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick
Call func(sender)
End Sub


Public Sub func(ByVal sender As Object)
Dim xxx As String = CType(sender, DataGridView)(0, 1).Value.ToString
などのコード・・・
End Sub

というコードで
funcを別のモジュールから使用したいのですが


引用返信 編集キー/
■85376 / inTopicNo.6)  Re[1]: senderを自分で生成する方法
□投稿者/ shu (1057回)-(2017/10/16(Mon) 13:37:02)
No85371 (ぷるるん さん) に返信
>
> 例えば
>
> Call DataGridView1_CellDoubleClick(Form2.DataGridView1, nothing)
>
> とやってみたのですが
> 呼び出したSub上で
呼び出したSub は この『DataGridView1_CellDoubleClick(Form2.DataGridView1, nothing)』を
記述したSubでしょうか?


> sender.Nameなどの
> 名前を抽出することはできましたが
イベントハンドラで使用されているsenderはObject型なので
Nameプロパティはそのままでは取得出来ないかと思いますがどのように書かれましたか?


> Form2.DataGridView1上のグラフデータを読み出そうとしたり
どのように読みだそうとしましたか?


> グラフにデータを書き込もうとしてエラーとなりうまくいきません
どのように書き込もうとしてどのようなエラーが発生しましたか?

引用返信 編集キー/
■85384 / inTopicNo.7)  Re[1]: senderを自分で生成する方法
□投稿者/ Jitta (328回)-(2017/10/16(Mon) 21:28:17)
No85371 (ぷるるん さん) に返信
> 普通は引数のsenderには実行したオブジェクトが自動で代入されるのですが
> 自分でそのオブジェクトを生成するにはどうしたら良いですか?

 VB.NET は、Object Oriented Language です。
「Object Oriented」は「オブジェクト指向」と訳されていますが、実はこれが大変な誤訳で、正しくは「目的志向」です。
つまり、何らかの目的があって、それを目指す(「指向」は向いているだけ)というわけです。

 イベントハンドラには、「オブジェクトで何らかのイベントが発生した」ことを通知するという目的があります。
sender 引数には、「イベントが発生したオブジェクトを知らせる」という目的があります。
ですから、「自分でそのオブジェクトを生成する」必要はありません。
イベントが発生したオブジェクトを通知すればいいだけです。
目的に沿った使い方をしてください。
引用返信 編集キー/
■85386 / inTopicNo.8)  Re[5]: senderを自分で生成する方法
□投稿者/ Azulean (881回)-(2017/10/16(Mon) 22:14:07)
No85375 (ぷるるん さん) に返信
> Private Sub DataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick
> Call func(sender)
>  End Sub
> 
> Public Sub func(ByVal sender As Object)
> Dim xxx As String = CType(sender, DataGridView)(0, 1).Value.ToString
> などのコード・・・
>  End Sub
> 
> というコードで
> funcを別のモジュールから使用したいのですが

よくわからないのですが、そのように書けるってことは、同じフォーム内にある func ですよね?
だったら、sender なんてもらわずに、以下のように書けばよいのでは?

Public Sub func()
  Dim xxx As String = DataGridView1(0, 1).Value.ToString
End Sub


フォーム自体が手に入らない(=func 自体を呼ぶのに苦労する)ようなモジュールであるなら、設計を考え直した方が良いと苦言を呈しておきます。

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ