使用control.Visible返回False,如果它位于未选中的选项卡页面上

时间:2010-07-28 09:05:48

标签: .net winforms controls

我有一个带有2个标签控件的表单。 表格在标签1上打开。 我需要在tab2上验证一些控件。

如果我要验证的控件已设置为不可见,那么我想忽略验证。 (即控件已被用户隐藏) 问题是选项卡2上的所有控件都返回Visible = False,因为未选中Tab。

如果任何父项的Visible属性为False,则单个控件上的可见返回False,我无法确定控件是否已在代码中设置为Visible = False,或者Visible = False是否因为父选项卡控件是不可见。

我是如何知道如何在代码中将控件设置为Visible = False? 控件类中的私有“状态”变量似乎保留了这些信息,但我不想使用反射...这将会很慢并且感觉有点hacky!

我唯一的另一个想法是,我将不得不将自己的属性添加到控件类中以隐藏它们(它们是我写的控件)
但这意味着在我的所有表单上都有很多工作(我有很多表单可以隐藏单个控件或控件组的各种代码)

希望这是有道理的。

谢谢, 迈克G

3 个答案:

答案 0 :(得分: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}))

答案 1 :(得分:0)

如果要在控件上放置任意标记,可以将值编码到Control.Tag属性中。

然而,这似乎不是管理验证的最佳方式......

答案 2 :(得分:0)

我通过继承每个basecontrol然后使用我自己的实现来解决这个问题。然后我可以将自己的isvalidatable属性添加到控件中。

我知道,但它确实允许我们通过仅更改此基类来更改DevExpress变体的Windows窗体控件。