2010-07-28 15 views
1

我有一個帶有2個選項卡控件的表單。 表單在標籤1上打開。 我需要在標籤2上驗證一些控件。使用control.Visible返回False,如果它在未選中的標籤頁上

如果我想驗證的控件已被設置爲不可見,那麼我想忽略驗證。 (即控件已經隱藏起來) 問題是選項卡2上的所有控件返回Visible = False,因爲未選中Tab。

因爲在單個控件上可見,所以返回False,如果父項的Visible屬性爲False,我無法確定控件是否已設置爲Visible = False或者Visible = False是否由於父項選項卡控件不可見。

任何想法如何我可以找出控件是否已設置爲Visible = False代碼中? 在控件類中的私有「狀態」變量似乎擁有這個信息,但我不想使用反射...這將是緩慢的,感覺有點哈克!

我唯一的其他想法是,我將有我自己的屬性添加到控件類隱藏起來(他們是我寫的控件)
但是,這意味着大量的工作,在我的所有形式(我有許多形式,有不同的代碼位隱藏單獨的控件或控件組)

希望是有道理的。

謝謝, 邁克·G

+0

有沒有人對朋友GetState()的功能有所瞭解 – MikeG 2010-07-28 10:15:40

回答

4

最終我決定使用反射。 完成一些性能測試,對我的場景來說似乎沒問題。

首先,我檢查表單上是否存在選項卡控件,如果沒有,那麼可以忽略此代碼並僅使用control.IsVisble。 此外,如果control.Visible reutrns true,則必須被設置爲在代碼中看到,這只是那麼曖昧的情況下,我然後用這個...

Private Shared GetStateMethodInfo As MethodInfo = _ 
GetType(Control).GetMethod("GetState", BindingFlags.Instance Or BindingFlags.NonPublic) 

然後調用...

Return CBool(GetStateMethodInfo.Invoke(control, New Object() {2})) 
+0

此外,除此之外,組合框或面板將變得不可見,而不是其包含的控件。因此,我現在相當複雜的代碼現在「遍歷」父級別,查看所有Visble特性,但只是以不同方式處理選項卡頁面。 – MikeG 2010-08-04 07:56:49

0

,如果你想將一個任意標記上控制你可以編碼一個值到Control.Tag財產。

然而,這似乎並不像管理有效性的最好方法......

+0

嗨, 感謝您的建議。 然而,這個想法很多工作,因爲我有許多形式和幾個應用程序中的這個問題。 也不需要標籤因爲我已經子類化所有的控件,所以我可以添加自己的個性。 – MikeG 2010-07-28 11:20:14

0

我通過繼承每個basecontrols然後使用我自己的實現來解決這個問題。然後,我可以將我自己的isvalidatable屬性添加到控件。

聽起來超出了我所知的範圍,但它確實允許我們通過僅更改此基類來更改DevExpress變體的Windows窗體控件。

+0

嗨Johhny感謝您的反饋意見,我認爲這是因爲我們也是iunheriting控制。主要問題是,我認爲這是有時候我們不能看到的父控制組的集合,即,組合框或面板將變得不可見,而不是它所包含的控制器,因此我的複雜的基於代碼的代碼「向上」走向父層次結構在所有Visble屬性。 – MikeG 2010-08-04 07:55:39

相關問題