DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数Form間での処理について。

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 1.1]
分類:[.NET]

また質問させて頂きます。


Form1・・・PictureBox1個
Form2・・・PictureBox24個
Form3・・・PictureBox32個
があります。

Form1からForm2のPictureBoxへDrag&Dropができます。
Form3からForm2へもDrag&Dropできます。

Form1からForm2へDrag&Dropした時にForm1のTextBox1のデータを削除します。

以下Form1コード一部

If hForm2 Is Nothing Then
hForm2 = New Form2()
hForm2.Show()
AddHandler hForm2.PictureBox1.DragDrop, AddressOf Form2_DragDrop

Private Sub Form2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
TextBox1.Text = Nothing
End Sub

そこでForm3からForm2へDrag&Dropした時にもForm3のTextBoxのデータを削除したいのですが
その方法が分からず困っております。

メインがForm1で任意でForm2やForm3を開くことが出来る仕様です。


初心者です。

宜しくお願い致します。
■No21637に返信(たかさんの記事)
>
> メインがForm1で任意でForm2やForm3を開くことが出来る仕様です。
>

処理をForm1に統一してはいかがでしょう?
AddHandler hForm2.PictureBox1.DragDrop, AddressOf Form1_DragDrop

Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
'sender でどこのフォームか判断する
End Sub

>初心者です。
ちなみに、「初心者です」って書くのはやめませんか?
初心者だからってやさしくはしません。
ドラッグするデータをIDataObjectを実装したクラスにして
ドラッグ元を区別するプロパティを設定すればよいと思います。
■No21639に返信(やじゅさんの記事)
> Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
> 'sender でどこのフォームか判断する
> End Sub

ドロップは常にForm1の仕様なのでsenderはForm1では?
■No21641に返信(まどかさんの記事)

そうですね、私のやり方だと
Form3からきたのは分かるけど、Form2へやったってのが取れないですね(^^;
やじゅさん、まどかさん

ありがとうございます。

>やじゅさん
「初心者」と書かないようにします。
私としては、かなり専門用語的なアドバイスだと理解できないかもしれないと思って
アドバイス頂ける方に、私がどんなレベルかを知って頂こうと思ったのですが
甘い考えですね。今後書かないようにします。

>まどかさん

またありがとうございます。
「IDataObjectを実装したクラス」・・・調べてみたのですが
なかなか参考サイトがなく、C#での例がいくつかありました。
まだちょっと私には難しかったですがそのような方法も今後必要かと思いますので
少しずつ勉強していきます。

>やじゅさん、まどかさん

今回の質問内容ですが、試行錯誤の末、何とか意図する動作にたどり着きました。

Form3に

Private Shared _form3Instance As Form3
Public Shared Property Form3Instance() As Form3
Get
Return _form3Instance
End Get
Set(ByVal Value As Form3)
_form3Instance = Value
End Set
End Property

Public Property Form3_txt() As String
Get
Return TextBox1.Text
End Get
Set(ByVal Value As String)
TextBox1.Text = Value
End Set
End Property

を追加しました。

Form3ロード時に
Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form3.Form3Instance = Me
End Sub
を書き、

Form1には
If hForm2 Is Nothing Then
hForm2 = New Form2()
hForm2.Show()
AddHandler hForm2.PictureBox1.DragDrop, AddressOf Form2_DragDrop

Private Sub Form2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
TextBox1.Text = Nothing
Form3.Form3Instance.TextBox1.Text = Nothing <------------ これを追加しました。
End Sub

これで、Form2にDrag&Dropした時に、Form1とForm3のTextBox1.Textの値が両方ともなくなりますが、これでも結果が意図した動作となりましたので
今回はこれで行ってみようと思います。

こちらのサイトの.NET Tipsの
「別のフォームのデータを取得、設定する」に紹介されており知っていて使っていたのですが
今回のような使い方ができるとは思っておりませんでした。


どうもありがとうございました。
解決済み!
はじめまして、引っ込んだ略と申します。
 
 Drag開始元のForm内のコードで、
 DoDragDropメソッド呼び出し(DragAndDrop操作が完了するか、取り消されるまで処理が戻らない)の後で、
 TextBoxのTextを削除してみてはどうでしょうか?
 
 Dim effect As DragDropEffects = PictureBox1.DoDragDrop(略)
 ' DragAndDrop終了後にここに来る
 If effect = DragDropEffects.Move Then
   TextBox1.Text = ""
 End If
 
 P.S. 試したわけではないので、もし変なことを書いていたらごめんなさい。
 
 参考文献
  日経BPソフトプレス発行「プログラミングVisualBasic.NET Vol.2活用編」、pp. 101 - 105.
 
以上です。
引っ込んだ略さん。

ありがとうございます。
試してみたところ非常にスマート、クールな処理が出来ました。

私の試行錯誤でもなんとかなりますがこちらの方が非常に良いと思います。

どうもありがとうございました!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板