2010-03-19 5 views
0

Je suis en train de créer une application de reporting, et nos clients vont devoir générer de très gros rapports qui nécessitent un peu de mémoire. (. Le spectateur de rapports ouvre dans une nouvelle forme) Ive été dans une humeur réusinage ces derniers temps, donc je me demandais ce que la meilleure façon d'accéder aux propriétés d'une autre forme ouverte serait Jusqu'à présent, j'ai:Quel est le moyen le plus efficace d'accéder à d'autres contrôles de formulaires dans .NET?

Dim form As MainSelections 

form = My.Application.OpenForms (2)

yay ou nay.

Merci

* Edition - Je devrais probablement mentionner que ce que je besoin est une étiquette, deux ramasseurs de temps de date, 5 datagridviews et quelques ensembles de données. Ces cotrols ont les informations que je l'utilise pour mes paramètres

Répondre

3

First, ne pas utiliser les contrôles d'un formulaire directement, son considérée comme une mauvaise pratique, les données dépendantes d'accès par le biais d'une interface à la place:

(Attention: code non testé et mon VB-fu est rouillé, mais vous devriez obtenir l'idée générale)

public interface ILoginScreen 
    Property Username as String with Get 
    Property Password as String with Get 
end interface 

Mettre en oeuvre l'interface sur votre formulaire. (Et assurez-vous que votre interface ne prend pas en types de données de retour comme TextBox, ComboBox, etc, qui irait à l'encontre de l'abstraction d'interface.)

Deuxième, ne pas utiliser les dépendances par état global comme la collection OpenForms , passez vos dépendances à vos objets via un constructeur à la place.

Donc, si votre formulaire rapports dépend de votre écran de connexion (ou tout autre écran), vous devez avoir un constructeur qui accepte une implémentation ILoginScreen:

public sub New(loginScreen as ILoginScreen) 
    me.LoginScreen = loginScreen 
end sub 

Et instancier vos rapports forment en tant que tels:

dim reportScreen as new ReportScreen(Me) 
'passes self as ILoginScreen implementation 

Selon l'OP dans les commentaires:

En fait, ce dont j'ai besoin est une étiquette, deux sélecteurs de date, 5 datagridviews et quelques jeux de données. Ces cotrols ont les informations que j'utilise pour mes paramètres.

Évidemment, l'OP passe ces contrôles en tant que paramètres de rapport. Probablement la création et la mise en œuvre d'une interface est excessive pour ses besoins, mais le principe général de l'injection de dépendance est correct.

passer votre données dans votre constructeur de formulaire Rapport:

class Report 
    public sub New(start as DateTime, end as DateTime, label as String, _ 
     etc as Whatever) 
end class 

vous S'il vous plaît assurez-passer des choses comme DateTimes, Cordes, Entiers, DataSets, etc - ou un objet typé représentant vos paramètres.Ne pas passer DateTimePickers, TextBoxes, Comboboxes, DataGridViews, etc Votre formulaire de rapport ne doit pas savoir ou se soucier que ses dates de début et de fin proviennent d'un DateTimePicker ou non, il devrait seulement se soucier qu'il a effectivement des dates de une sorte. Passer les contrôles de formulaire paresseusement est un moyen infaillible pour enrager la prochaine personne qui travaille sur votre code.

+0

Je suis encore un peu nouveau à ce sujet, alors devrais-je avoir un module contenant les variables puis les passer dans le constructeur du formulaire de rapport? Je suis un peu confus. – broke

+0

@broke: non, vous n'avez pas besoin d'un autre module. Créez simplement le ReportForm à partir de votre formulaire MainSelections, assurez-vous d'appeler le constructeur qui prend vos paramètres: 'new ReportForm (dtStartTime.SelectedDateTime, dtEndTime.SelectedDateTime, lblReportName.Text, [toutes les autres propriétés]). Show()'. – Juliet

+0

Désolé d'être un parasite, mais je pense que je l'ai maintenant. Dans mes MainSelections j'ai: Dim reportscreen As New FORMULAIREDERAPPORT (lblNumber.Text) reportscreen.ShowDialog() Puis dans mon FORMULAIREDERAPPORT j'ai Sub New Public (ByVal reportnum As String) 'Cet appel est requis par le Concepteur de formulaires Windows. InitializeComponent() 'Ajouter une initialisation après l'appel InitializeComponent(). End Sub Je peux remplir le reste des exigences comme les jeux de données et tout ça. Suis-je sur la bonne voie? – broke

Questions connexes