2009-06-30 5 views
4

problème étenduLes meilleures pratiques lorsque vous avez besoin de deux contrôles utilisateur (WinForms) pour communiquer

Je voudrais ajouter un nouveau problème en plus du problème initial indiqué ci-dessous. L'un des contrôles utilisateur de l'application contient une liste d'objets auxquels j'ai besoin d'accéder à partir d'un autre contrôle utilisateur. Comment cela peut-il être fait? (Je ne crois pas que la division en contrôles est très bien effectuée, mais je préfère ne pas le changer ..)

Dois-je le faire par événements comme avec le problème d'origine, ou devrais-je obtenir le parent Formulaire, et l'utiliser pour trouver l'instance du contrôle, et l'exposer comme une propriété?


problème d'origine

J'ai deux contrôles utilisateur sous une forme que je veux être en mesure de communiquer entre eux. Usercontrol A devrait être capable de démarrer une opération sur B.

Quelle est la meilleure façon de résoudre ce problème? Le formulaire doit-il attendre un événement de A, puis commencer l'opération sur B? Tout modèle de conception pour cela? Ou est-ce une solution encore plus facile?

Merci d'avance! :)

Répondre

2

Les deux contrôles utilisateur ne devraient pas avoir connaissance de l'autre. Si vous souhaitez toujours les traiter en tant que paire, envisagez de créer un troisième contrôle utilisateur pour les héberger.

Le formulaire doit-il attendre un événement de A, puis démarrer l'opération sur B?

Oui, c'est la seule bonne façon de gérer cela.

Le problème étendu (bonus?) Est un peu plus compliqué. Je gérerais ceci en ayant le formulaire passer le contrôle de l'utilisateur un délégué à une méthode sur l'autre contrôle d'utilisateur pour récupérer les données. Le contrôle utilisateur peut ensuite invoquer la méthode delegate pour appeler la méthode sur l'autre contrôle sans avoir aucune connaissance de son implémentation.

+0

J'ai essayé l'approche de délégué, et cela a fonctionné très bien. (bien sûr vous dites!) Tout à fait élégant aussi contrairement au reste;) – l3dx

0
  1. Expose les données en tant que propriété.
  2. Créez une propriété sur l'autre contrôle utilisateur que le formulaire parent va remplir avec la référence au contrôle avec les données.

Pseudo Code:

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

var items = uca.Items; 
0

je le ferais comme ça (je l'utilise 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 

Mettre en oeuvre la principale forme comme suit

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 est comme suit:

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 

CE CODE N'EST PAS TESTÉ.

Ceci est assez faiblement couplé de cette façon. Je suppose que dans un monde idéal, vous envelopperiez ce que vous avez besoin dans UserControlA DataGrid dans les méthodes et les propriétés et les consommer de cette façon. Mais s'il y a beaucoup de membres auxquels vous référez dans le DataGrid, c'est certainement plus facile. Je ne prétends pas que c'est un design parfait. J'apprends toujours l'architecture Winforms. Que pensent les experts?

Seth B Spearman

Questions connexes