加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

vb.net – 隐藏NumericUpDown控件上的向上/向下按钮

发布时间:2020-12-17 07:15:32 所属栏目:百科 来源:网络整理
导读:我试图以几种方式子类化NumericUpDown以获得更好的功能和外观. 由于NUD是两个控件的构造,我想在属性“Increment”设置为0的情况下隐藏上/下按钮. 此代码位于子类中: Protected Overrides Sub OnTextBoxResize(ByVal source As Object,ByVal e As System.Eve
我试图以几种方式子类化NumericUpDown以获得更好的功能和外观.

由于NUD是两个控件的构造,我想在属性“Increment”设置为0的情况下隐藏上/下按钮.

此代码位于子类中:

Protected Overrides Sub OnTextBoxResize(ByVal source As Object,ByVal e As System.EventArgs)

        Controls(0).Hide()
End Sub

……它运作正常.
但在该函数中,我无法像这样检查Increment属性的值:

Protected Overrides Sub OnTextBoxResize(ByVal source As Object,ByVal e As System.EventArgs)

If Me.Increment = 0 Then
      Controls(0).Hide()
End if
End Sub

在此功能的范围内,我无法访问.
我也尝试使用局部变量,但无法在OnTextBoxResize之前找到触发哪个事件来读取Increment属性的值.

在这种情况下该怎么做才能获得所需的功能?

解决方法

这似乎运作得相当好.它将增量属性设置为阴影,以便在更改增量值时设置微调控件的可见性.基本控件调用一个名为PositionControls的底层私有方法,你无法阻止 – 该方法可能会产生一些闪烁,但在我的测试中,它没有.

Public Class MyNumBox
  Inherits NumericUpDown

  Shadows Property Increment As Decimal
    Get
      Return MyBase.Increment
    End Get
    Set(value As Decimal)
      MyBase.Increment = value
      OnTextBoxResize(Me,EventArgs.Empty)
    End Set
  End Property

  Protected Overrides Sub OnHandleCreated(e As EventArgs)
    MyBase.OnHandleCreated(e)
    OnTextBoxResize(Me,EventArgs.Empty)
  End Sub

  Protected Overrides Sub OnTextBoxResize(source As Object,e As EventArgs)
    If Me.IsHandleCreated Then
      Me.Height = Me.PreferredHeight
      Me.Controls(0).Visible = (MyBase.Increment > 0)
      Dim borderWidth As Integer = 0
      If Me.BorderStyle > BorderStyle.None Then
        borderWidth = SystemInformation.Border3DSize.Width
      End If
      Dim textWidth As Integer
      If Me.Increment = 0 Then
        textWidth = Me.ClientSize.Width - (borderWidth * 2)
      Else
        textWidth = Me.ClientSize.Width - Me.Controls(0).Width - (borderWidth * 2)
      End If
      If Me.UpDownAlign = LeftRightAlignment.Left Then
        If Me.Increment = 0 Then
          Me.Controls(1).SetBounds(borderWidth,borderWidth,_
                                   textWidth,Me.Controls(1).Height)
        Else
          Me.Controls(1).SetBounds(borderWidth + Me.Controls(0).Width,_
                                   Me.Controls(1).Top,textWidth,Me.Controls(1).Height)
        End If
      Else
        Me.Controls(1).SetBounds(borderWidth,Me.Controls(1).Top,_
                                 textWidth,Me.Controls(1).Height)
      End If
      Me.Refresh()
    End If
  End Sub
End Class

在OnTextBoxResize重写中,我将控件重新定位到适当的位置,此版本确实考虑了UpDownAlign属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读