2010-03-19 3 views
0

Я создаю приложение для отчетности, и нашим клиентам потребуется создать несколько довольно больших отчетов, которые требуют довольно много памяти. (. Зритель отчетов открывается в новой форме) Ive был в рефакторингом настроение в последнее время, поэтому мне было интересно, что лучший способ получить доступ к свойствам другого открытой форме будет До сих пор у меня есть:Каков наиболее эффективный способ доступа к другим элементам управления формами в .NET?

Dim form As MainSelections 

Форма = My.Application.OpenForms (2)

yay или nay.

Благодаря

* Edit - я, вероятно, следует отметить, что мне нужно, это метка, два временных сборщиков даты, 5 DataGridViews и несколько наборов данных. Эти cotrols имеют информацию я использую для моих параметров

ответ

3

Первые, не доступа к элементам управления одной из форм непосредственно, его считается плохой практикой, доступ зависимых данных через интерфейс вместо:

(Внимание: непроверенный код и мой VB-фу ржавый, но вы должны получить общее представление)

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

Реализовать интерфейс на вашей форме. (И убедитесь, что ваш интерфейс не возвращаемых типов данных, таких как TextBox, ComboBox и т.д., что бы поражение цели интерфейса абстракции.)

Второго, не имеет доступа к зависимости через глобальное состояние, как коллекция OpenForms , передайте свои зависимости к вашим объектам через конструктор.

Так что, если ваши отчеты форма зависит от экрана входа в систему (или любой другой экран), вы должны иметь конструктор, который принимает реализацию ILoginScreen:

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

И инстанцирует ваши отчеты образуют как таковой:

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

Согласно ОП в комментариях:

На самом деле мне нужна этикетка, две выборщики времени, 5 datagridviews и несколько наборов данных. Эти котроли имеют информацию , которую я использую для моих параметров.

Очевидно, что OP передает эти элементы управления в качестве параметров отчета. Вероятно, создание и внедрение интерфейса чрезмерно для его потребностей, но общий принцип инъекции зависимостей является правильным.

Передайте свои данные в конструктор вашей формы отчета в:

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

Пожалуйста, убедитесь, что вы передать вещи, как DateTimes, струнный, Целый, DataSets и т.д. - или набран объект, представляющий ваши параметры.

Не пропускайте DateTimePickers, TextBoxes, Comboboxes, DataGridViews и т. Д. Ваша форма отчета не должна знать или учитывать, что ее начальные и конечные даты взяты из DateTimePicker или нет, все равно, что на самом деле у нее есть даты какой-то. Ленько передавая контроль формы - это верный способ разжечь следующего человека, который работает над вашим кодом.

+0

Я все еще немного новичок в этом, поэтому должен ли я иметь модуль, содержащий переменные, а затем передать их в конструктор формы отчета? Я немного смущен. – broke

+0

@broke: нет, вам не нужен другой модуль. Просто создайте ReportForm из формы MainSelections, убедитесь, что вы вызываете конструктор, который принимает ваши параметры: 'new ReportForm (dtStartTime.SelectedDateTime, dtEndTime.SelectedDateTime, lblReportName.Text, [любые другие свойства]). Show()'. – Juliet

+0

Извините за то, что я вредитель, но я думаю, что получил его сейчас. В моих MainSelections я есть: Dim reportscreen As New REPORTFORM (lblNumber.Text) reportscreen.ShowDialog() Тогда в моей REPORTFORM я имею Public Sub New (ByVal reportnum As String) 'Этот вызов требуется разработчиком форм Windows. InitializeComponent() 'Добавить инициализацию после вызова InitializeComponent(). End Sub Я могу заполнить остальные требования, такие как наборы данных и все такое. Я на правильном пути? – broke

Смежные вопросы