Первые, не доступа к элементам управления одной из форм непосредственно, его считается плохой практикой, доступ зависимых данных через интерфейс вместо:
(Внимание: непроверенный код и мой 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 или нет, все равно, что на самом деле у нее есть даты какой-то. Ленько передавая контроль формы - это верный способ разжечь следующего человека, который работает над вашим кодом.
Я все еще немного новичок в этом, поэтому должен ли я иметь модуль, содержащий переменные, а затем передать их в конструктор формы отчета? Я немного смущен. – broke
@broke: нет, вам не нужен другой модуль. Просто создайте ReportForm из формы MainSelections, убедитесь, что вы вызываете конструктор, который принимает ваши параметры: 'new ReportForm (dtStartTime.SelectedDateTime, dtEndTime.SelectedDateTime, lblReportName.Text, [любые другие свойства]). Show()'. – Juliet
Извините за то, что я вредитель, но я думаю, что получил его сейчас. В моих MainSelections я есть: Dim reportscreen As New REPORTFORM (lblNumber.Text) reportscreen.ShowDialog() Тогда в моей REPORTFORM я имею Public Sub New (ByVal reportnum As String) 'Этот вызов требуется разработчиком форм Windows. InitializeComponent() 'Добавить инициализацию после вызова InitializeComponent(). End Sub Я могу заполнить остальные требования, такие как наборы данных и все такое. Я на правильном пути? – broke