2009-06-30 6 views
4

拡張問題ベストプラクティスあなたは、私は以下の指定された元の問題に加えて、新しい問題を追加したい

を伝達するために2つのユーザーコントロール(リサイズ)が必要です。アプリケーションのユーザーコントロールの1つに、別のユーザーコントロールからアクセスする必要のあるオブジェクトの一覧が含まれています。これはどうすればできますか? (私はコントロールへの分割は非常にうまく実行されているとは思わないが、私はむしろそれを変更したくないだろう)。

私は元の問題のようにイベントで行うか、フォームを使用してコントロールのインスタンスを検索し、それをプロパティとして公開しますか?


オリジナル問題

私は私が相互に通信できるようにする形で2つのユーザーコントロールを持っています。ユーザーコントロールAはBで操作を開始できます。

これを解決する方法は何ですか?フォームがAからのイベントを待機し、Bで操作を開始する必要がありますか?これのための任意のデザインパターン?それとももっと簡単な解決策ですか?

ありがとうございます! :)

答えて

2

2人のユーザーコントロールは、相互の知識がありません。それらを常にペアとして処理したい場合は、それらを格納するための第3のユーザーコントロールを作成することを検討してください。

フォームがAからのイベントを待機し、Bで操作を開始する必要がありますか?

はい、これはこれを処理する唯一の良い方法です。

拡張(ボーナス?)の問題は少しトリッキーです。私は、フォームを他のユーザーコントロール上のメソッドにデリゲートを渡してデータを取得するようにして、これを処理します。ユーザーコントロールは、デリゲートメソッドを呼び出して、実装の知識がなくても他のコントロールのメソッドを呼び出すことができます。

+0

私はデリゲートアプローチを試してみましたが、うまくいきました。 (もちろんあなたは言う!)残りの部分とは対照的にかなりエレガントである;) – l3dx

0
  1. データをプロパティとして公開します。
  2. 親フォームがデータでコントロールへの参照を設定するプロパティを、他のユーザーコントロールに作成します。

擬似コード:

public UserControlA uca { get; set; } 
... 

var items = uca.Items; 
0

私は、この(私はvb.netを使用)

Class MyUserControlA 
'Inherits UserControl '(This line will be in your desinger file) 

Delegate Sub SomethingEventHandler (sender as object, e as EventArgs) '(assumes you are not going to override event args) 

Public Event SomethingEvent as SomethingEventHandler 

private _someData as String 

Public Readonly Property MyDataGrid as DataGridView 
    Get 
     Return DataGridView1 ' this is in the designer form of the user control 
    End Get 

Public Property SomeData as string 
    Get 
     return _someData 
    End Get 
    Set(value as string) 
     _someData as string 
    End Set 
End Property 

Protected Sub OnSomethingEvent() 
    RaiseEvent SomethingEvent(Me, EventArgs()) 
End Sub 

'....something happens and you want to raise the event 
OnSomethingEvent 

End Class 

Class MainForm 
Implements Form 'designer file 

'....other code 
Sub MyUserControlA1_SomethingEvent Handles MyUserControlA1.SomethingEvent 
    'instead of calling a property you could override eventArgs and return the control that way. 
    MyUserControlB1.OtherDataGridView=MyUserControlA1.MyDataGrid 
End Sub 

End Class 

UserControlBは、次のようにメインフォームを実装するようにそれを行うだろう

Class UserControlB 
Inherits UserControl ' designer form 

'...other code 

private _dataGrid as DataGridView=Nothing 


    Public Property DataGrid() As DataGridView 
     Get 
      Return _dataGrid 
     End Get 
     Set(ByVal value As DataGridView) 
      'only set if null 
      if _dataGrid is Nothing then _dataGrid = value 
     End Set 
    End Property 



'do stuff with the control...I would always check for null 
function DoSomethingWithDataGrid as integer 
    if _dataGrid IsNot Nothing then 
     return _dataGrid.Items.Count 
    End If 
End Sub 
End Class 

このコードはテストしません。

これはかなり疎結合です。理想的な世界では、メソッドとプロパティでUserControlA DataGridに必要なものをラップし、そのように消費すると思います。しかし、多くのメンバーがいる場合は、DataGridでreferecningしている場合、これは確かに簡単です。

私はこれが完璧なデザインであるとは信じていません。私はまだwinformsアーキテクチャを学んでいます。あなたは何を専門家は思いますか?

セスBスピアマン

関連する問題