Vb.net 强制继承组合框';DropDownStyle属性设置为DropDown
在VB.NET(WinForms)中,如何强制继承组合框的控件只允许其Vb.net 强制继承组合框';DropDownStyle属性设置为DropDown,vb.net,winforms,inheritance,combobox,Vb.net,Winforms,Inheritance,Combobox,在VB.NET(WinForms)中,如何强制继承组合框的控件只允许其DropDownStyle属性使用DropDownStyle?DropDownStyle属性不可重写,这限制了强制操作的次数。.NETFramework采用的方法就是隐藏属性。类似于: Private Const DefaultStyle As ComboBoxStyle = ComboBoxStyle.DropDown Public Sub New() MyBase.DropDownStyle = DefaultS
DropDownStyle
属性使用DropDownStyle
?DropDownStyle属性不可重写,这限制了强制操作的次数。.NETFramework采用的方法就是隐藏属性。类似于:
Private Const DefaultStyle As ComboBoxStyle = ComboBoxStyle.DropDown
Public Sub New()
MyBase.DropDownStyle = DefaultStyle
End Sub
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Overloads Property DropDownStyle As ComboBoxStyle
Get
Return MyBase.DropDownStyle
End Get
Set(value As ComboBoxStyle)
MyBase.DropDownStyle = DefaultStyle
End Set
End Property
Private Const DefaultStyle As ComboBoxStyle=ComboBoxStyle.DropDown
公共分新()
MyBase.DropDownStyle=DefaultStyle
端接头
Public重载属性DropDownStyle作为ComboBoxStyle
得到
Return MyBase.DropDownStyle
结束
设置(值为ComboBoxStyle)
MyBase.DropDownStyle=DefaultStyle
端集
端属性
Browsable属性对设计器隐藏属性,EditorBrowsable属性对文本编辑器隐藏属性,DesignerSerializationVisibility确保属性不会写入InitializeComponent()方法
但这并不能阻止客户端代码,如果它真的想要,那么它可以强制转换到ComboBox并绕过属性设置程序,仍然将MyBase.DropDownStyle属性指定给任意值。
重载的责任
仅隐藏基本成员,而不是覆盖它。从技术上讲,您仍然可以通过重写CreateParams来克服这一点,但是在ComboBox代码中经常使用该属性,从而使其真正有效。这是最好的了。对于框架来说已经足够好了。DropDownStyle属性是不可重写的,这限制了您可以执行的强制量。.NETFramework采用的方法就是隐藏属性。类似于:
Private Const DefaultStyle As ComboBoxStyle = ComboBoxStyle.DropDown
Public Sub New()
MyBase.DropDownStyle = DefaultStyle
End Sub
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Overloads Property DropDownStyle As ComboBoxStyle
Get
Return MyBase.DropDownStyle
End Get
Set(value As ComboBoxStyle)
MyBase.DropDownStyle = DefaultStyle
End Set
End Property
Private Const DefaultStyle As ComboBoxStyle=ComboBoxStyle.DropDown
公共分新()
MyBase.DropDownStyle=DefaultStyle
端接头
Public重载属性DropDownStyle作为ComboBoxStyle
得到
Return MyBase.DropDownStyle
结束
设置(值为ComboBoxStyle)
MyBase.DropDownStyle=DefaultStyle
端集
端属性
Browsable属性对设计器隐藏属性,EditorBrowsable属性对文本编辑器隐藏属性,DesignerSerializationVisibility确保属性不会写入InitializeComponent()方法
但这并不能阻止客户端代码,如果它真的想要,那么它可以强制转换到ComboBox并绕过属性设置程序,仍然将MyBase.DropDownStyle属性指定给任意值。
重载的责任
仅隐藏基本成员,而不是覆盖它。从技术上讲,您仍然可以通过重写CreateParams来克服这一点,但是在ComboBox代码中经常使用该属性,从而使其真正有效。这是最好的了。对于框架来说已经足够好了。要阻止客户端代码将DropDownStyle
设置为不同的值,您可以覆盖OnDropDownStyleChanged
并设置MyBase.DropDownStyle=DefaultStyle
@RezaAghaei,这将在技术上更改DropDownStyle
值,然后返回到DropDown
。不太干净,当孩子的DropDownStyle
事件被触发时,可能会导致不良副作用…@Makaveli84我所说的,除了现有的解决方案之外,还应该做,以防止使用客户端代码更改DropDownStyle
。您应该知道,OnDropDownStyleChanged
只负责引发DropDownStyleChanged
事件,而不负责其他任何事情。因此,不需要引发事件就可以安全地覆盖它。要理解我所说的,请尝试DirectCast(derivedComboBox,ComboBox)。DropDownStyle=ComboBoxStyle.DropDownList@RezaAghaei是的,“除了现有的解决方案部分之外”是很明显的,不是吗?我尝试了CType(mynewcombox1,ComboBox)。DropDownStyle=ComboBoxStyle.DropDownList
,但在我们的例子中,这可能与DirectCast
相同。。不是吗?为了理解你说的话?是的。现在,为了让您理解我说的话,请在引发事件时尝试重写:MyBase.OnDropDownStyleChanged(e)
@RezaAghaei我相信您确实理解了。我不应该假设你没有。虽然您的观点是正确的,通过消除不必要的MyBase.OnDropDownStyleChanged(e)
调用可以安全地抑制事件,但事实仍然是,您的添加仍然会导致DropDownStyle
来回更改,这在绘制
闪烁中很明显。若要阻止客户端代码将DropDownStyle
设置为不同的值,您可以覆盖OnDropDownStyleChanged
并设置MyBase.DropDownStyle=DefaultStyle
@RezaAghaei,从技术上更改DropDownStyle
值,然后返回到DropDownStyle
。不太干净,当孩子的DropDownStyle
事件被触发时,可能会导致不良副作用…@Makaveli84我所说的,除了现有的解决方案之外,还应该做,以防止使用客户端代码更改DropDownStyle
。您应该知道,OnDropDownStyleChanged
只负责引发DropDownStyleChanged
事件,而不负责其他任何事情。因此,不需要引发事件就可以安全地覆盖它。要理解我所说的,请尝试DirectCast(derivedComboBox,ComboBox)。DropDownStyle=ComboBoxStyle.DropDownList@RezaAghaei是的,“除了现有的解决方案部分之外”是很明显的,不是吗?我尝试了CType(mynewcombox1,ComboBox)。DropDownStyle=ComboBoxStyle.DropDownList
,但在我们的例子中,这可能与DirectCast
相同。。不是吗?为了理解你说的话?是的。现在,为了让您理解我说的话,请在引发事件时尝试重写:MyBase.OnDropDownStyleChanged(e)
@RezaAghaei我相信您确实理解了。我不应该做假设