首先的信息,不直接訪問窗體的控件,它被認爲是不好的做法,通過替代的接口訪問相關數據:
(警告:未經測試的代碼和我的VB-fu是生鏽的,但你應該得到的一般想法)
public interface ILoginScreen
Property Username as String with Get
Property Password as String with Get
end interface
實現您的窗體上的接口。 (並確保你的界面不返回的數據類型像文本框,組合框等,這會破壞接口抽象的目的。)
二,不通過像OpenForms收集全局狀態訪問的依賴,而是通過構造函數將你的依賴關係傳遞給你的對象。
所以,如果您的報告形式取決於您的登錄屏幕上(或任何其他屏幕),你應該有它接受一個ILoginScreen實現一個構造函數:
public sub New(loginScreen as ILoginScreen)
me.LoginScreen = loginScreen
end sub
和實例報表形成這樣:
dim reportScreen as new ReportScreen(Me)
'passes self as ILoginScreen implementation
根據註釋的OP:
其實我需要的是一個標籤,兩個 日期時間選擇器,5個datagridviews和 幾個數據集。那些cotrols有我使用我的參數的 信息。
很明顯,OP將這些控件作爲報告參數傳遞。可能創建和實現接口對他的需求來說過於過分,但依賴注入的一般原則是正確的。
傳遞您的數據到您的報告表的構造:
class Report
public sub New(start as DateTime, end as DateTime, label as String, _
etc as Whatever)
end class
請確保您傳遞之類的東西DateTime是否,字符串,整數,數據集等 - 或代表你的參數類型的對象。
不要傳遞DateTimePickers,TextBoxes,Comboboxes,DataGridViews等。您的報表不應該知道或關心其開始日期和結束日期來自DateTimePicker或不是,它應該只關心它實際上有日期某種。懶惰的傳遞表單控件是激怒下一個工作在你的代碼上的人的絕對方式。
我還是有點新,所以我應該有一個包含變量的模塊,然後將它們傳遞到報表窗體的構造函數?我有點困惑。 – broke 2010-03-19 18:41:52
@broke:不,你不需要另一個模塊。只需從MainSelections表單創建ReportForm,確保你調用了你的參數的構造函數:'新的ReportForm(dtStartTime.SelectedDateTime,dtEndTime.SelectedDateTime,lblReportName.Text,[其他任何屬性]).show()'。 – Juliet 2010-03-19 18:53:15
對不起,作爲一種有害生物,但我想我現在得到了它。 在我MainSelections我有: 昏暗reportscreen作爲新ReportForm(lblNumber.Text) reportscreen.ShowDialog() 然後在我的ReportForm我有 的Public Sub New(BYVAL reportnum作爲字符串) '該調用是Windows窗體設計器所必需的。 InitializeComponent() '在InitializeComponent()調用之後添加任何初始化。 End Sub 我可以像數據集一樣填寫其他需求。我在正確的軌道上嗎? – broke 2010-03-19 19:12:50