2010-03-19 28 views
0

我正在創建一個報告應用程序,我們的客戶將需要生成一些相當大的報告,這需要相當多的內存。 (該報告觀衆以新的形式打開)的Ive在重新分解心情最近,所以我想知道什麼訪問的另一個打開窗體的屬性將是最好的辦法到目前爲止,我有:在.NET中訪問其他表單控件的最有效方式是什麼?

Dim form As MainSelections 

form = My.Application.OpenForms(2)

yay or nay。

感謝

*編輯 - 我也許應該提到的是什麼,我需要的是一個標籤,兩個日期時間選擇器,5個datagridviews和幾個數據集。這些cotrols有我用我的參數

回答

3

首先的信息,不直接訪問窗體的控件,它被認爲是不好的做法,通過替代的接口訪問相關數據:

(警告:未經測試的代碼和我的VB-fu是生鏽的,但你應該得到的一般想法)

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

實現您的窗體上的接口。 (並確保你的界面返回的數據類型像文本框,組合框等,這會破壞接口抽象的目的。)

,不通過像OpenForms收集全局狀態訪問的依賴,而是通過構造函數將你的依賴關係傳遞給你的對象。

所以,如果您的報告形式取決於您的登錄屏幕上(或任何其他屏幕),你應該有它接受一個I​​LoginScreen實現一個構造函數:

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或不是,它應該只關心它實際上有日期某種。懶惰的傳遞表單控件是激怒下一個工作在你的代碼上的人的絕對方式。

+0

我還是有點新,所以我應該有一個包含變量的模塊,然後將它們傳遞到報表窗體的構造函數?我有點困惑。 – broke 2010-03-19 18:41:52

+0

@broke:不,你不需要另一個模塊。只需從MainSelections表單創建ReportForm,確保你調用了你的參數的構造函數:'新的ReportForm(dtStartTime.SelectedDateTime,dtEndTime.SelectedDateTime,lblReportName.Text,[其他任何屬性]).show()'。 – Juliet 2010-03-19 18:53:15

+0

對不起,作爲一種有害生物,但我想我現在得到了它。 在我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

相關問題