2009-06-30 8 views
4

Erweiterte Problem zu kommunizierenBest Practice, wenn Sie benötigen zwei Bedienelemente (WinForms)

Ich mag würde ein neues Problem zusätzlich zu dem ursprünglichen Problem unten angegebenen hinzuzufügen. Eines der Benutzersteuerelemente in der Anwendung enthält eine Liste von Objekten, auf die ich von einem anderen Benutzersteuerelement aus zugreifen muss. Wie kann das gemacht werden? (Ich glaube nicht, dass die Aufteilung in Kontrollen sehr gut durchgeführt wird, aber ich würde es lieber nicht ändern ..)

Sollte ich es durch Ereignisse wie beim ursprünglichen Problem tun, oder sollte ich den Elternteil ergattern Form, und verwenden Sie es, um die Instanz des Steuerelements zu finden und als eine Eigenschaft verfügbar zu machen?


Original-Problem

Ich habe zwei Bedienelemente in einer Form, die ich miteinander kommunizieren können soll. Usercontrol A sollte in der Lage sein, eine Operation auf B zu starten.

Was ist die bevorzugte Lösung? Sollte das Formular auf ein Ereignis von A warten und dann den Vorgang auf B starten? Irgendein Entwurfsmuster dafür? Oder ist es eine noch einfachere Lösung?

Vielen Dank im Voraus! :)

Antwort

2

Die beiden Bedienelemente sollten keine Kenntnis voneinander haben. Wenn Sie mit ihnen immer als Paar arbeiten möchten, sollten Sie ein drittes Benutzersteuerelement erstellen, um sie zu speichern.

Sollte das Formular auf ein Ereignis von A warten und dann den Vorgang auf B starten?

Ja, das ist der einzige gute Weg, damit umzugehen.

Das erweiterte (Bonus?) Problem ist ein bisschen komplizierter. Ich würde damit umgehen, indem das Formular den Benutzer einen Delegaten an eine Methode auf dem anderen Benutzersteuerelement übergibt, um die Daten abzurufen. Das Benutzersteuerelement kann dann die Delegate-Methode aufrufen, um die Methode auf der anderen Steuerung aufzurufen, ohne Kenntnis von ihrer Implementierung zu haben.

+0

Ich versuchte den Delegierten Ansatz, und es hat gut funktioniert. (natürlich sagst du das!) Ziemlich elegant auch im Gegensatz zum Rest;) – l3dx

0
  1. Expose die Daten als eine Eigenschaft.
  2. Erstellen Sie eine Eigenschaft auf dem anderen Benutzersteuerelement, dass das übergeordnete Formular mit dem Verweis auf das Steuerelement mit den Daten ausgefüllt wird.

Pseudo-Code:

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

var items = uca.Items; 
0

Ich würde es so tun (ich verwende 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 

das Hauptformular wie folgt implementieren

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 ist wie folgt:

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 

Dieser Code wird nicht getestet.

Dies ist ziemlich locker auf diese Weise gekoppelt. Ich denke, in einer idealen Welt würden Sie das, was Sie in UserControlA DataGrid benötigen, in Methoden und Eigenschaften umwandeln und auf diese Weise konsumieren. Aber wenn es viele Mitglieder gibt, die Sie im DataGrid referenzieren, dann ist das sicherlich einfacher.

Ich behaupte nicht, dass dies ein perfektes Design ist. Ich lerne immer noch Winforms Architektur. Was denkst du Experten?

Seth B Spearman