Vb.net 强制继承组合框';DropDownStyle属性设置为DropDown

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

在VB.NET(WinForms)中,如何强制继承组合框的控件只允许其
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我相信您确实理解了。我不应该做假设