【问题标题】:Defining default values for subclassed NumericUpDown control为子类 NumericUpDown 控件定义默认值
【发布时间】:2013-10-22 19:20:03
【问题描述】:

我是我的 NumericUpDown 控件的子类,将其命名为 xNumericUpDown,它现在出现在我的 IDE 工具箱的顶部。
我希望我的新控件设置的默认值与原始控件不同。
最重要的是 DecimalPlaces=2、Minimal=Decimal.MinValue、Maximal=Decimal.MaxValue 和 Increment=0。

我想为此我应该在子类中创建正确的属性。 所以我尝试这样:

 <DefaultValue(Decimal.MinValue), _
  Browsable(True)> _
Shadows Property Minimum() As Decimal
    Get
        Return MyBase.Minimum
    End Get
    Set(ByVal value As Decimal)
        MyBase.Minimum = value
    End Set
End Property

但这不起作用。 当放置以形成我的控件时,具有原始 NumericUpDown 的属性。
最小值=0,最大值=100,小数点=0,增量=1。

如何获得所需的功能?

【问题讨论】:

    标签: vb.net numericupdown


    【解决方案1】:

    DefaultValue只是设计者用来判断是否对数据进行序列化(并在PropertyGrid中加粗)的一个属性。在您的代码中,您仍然需要自己“设置”默认值。

    Public Class xNumericUpDown
      Inherits NumericUpDown
    
      Public Sub New()
        MyBase.DecimalPlaces = 3
      End Sub
    
      <DefaultValue(3)> _
      Public Shadows Property DecimalPlaces As Integer
        Get
          Return MyBase.DecimalPlaces
        End Get
        Set(value As Integer)
          MyBase.DecimalPlaces = value
        End Set
      End Property
    End Class
    

    【讨论】:

    • 嗨 Lars,我对问题进行了一些研究,但仍然没有找到为我的控件设置默认/初始属性值的方法。您的建议(在 New 中)是不同的,所有此类控件的此设置值控制了不需要的内容。
    • 还有更多!我现在将 Minimal 设置为“-79228162514264337593543950335”什么是 Decimal.MinValue。当我右键单击属性网格并在该值上选择“重置”时,会出现错误消息:“'System.Single' 类型的对象无法转换为'System.Decimal' 类型”,当我在属性“增量”上尝试相同时:“'System.Int32' 类型的对象无法转换为 'System.Decimal' 类型”。这是正常的吗?在设计器文件中,这些值被写成 4 个整数的数组!
    • @user973238 我更新了示例。希望现在更清楚一点。不确定您对 Decimal.MinValue 的期望,因为这是您指定的。如您所知,十进制是一个很大的数字。我还不清楚你的评论:this set values for all such controls what is not wanted.这是默认值的定义,那么为什么你想要一个默认值呢?在我的示例中,“重置”命令将正常工作。您希望获得哪些最小值和最大值?
    • 谢谢拉尔斯,现在更清楚了。但是,请尝试为增量、最小值或/和最大值(或某些“小数”类型)设置属性,就像对“整数”的 DecimalPlaces 所做的那样,你会发现有些东西不能正常工作。通过使用 Decimal 类型的边界,我尝试获得 NUD 的“无限”,因为我稍后会进行自己的验证。我从来不需要这么大的数字,但有时我需要非常精确的循环重新计算,小数点后 10 位。为此,在 VB6 中,我必须使用“双”类型的数字。在 PostgreSQL 数据库中,我还将此类数据存储在“双精度”列类型中。
    • “我还不清楚你的评论:这个为所有这些控件设置了不需要的值。”那是因为“Double”类型的属性不表现“应该”,并且 NUD 开始表现得非常奇怪,并且程序“自己”改变了这些值,所以我很难解释发生了什么。
    【解决方案2】:

    我不太了解 Vb.Net,但这里是 c#,您可以在其中创建自己的控件,并为属性提供默认值。

    public class MyNumericUpDown : NumericUpDown
    {
        public MyNumericUpDown():base()
        {
            DecimalPlaces = 2;
            Minimum = decimal.MinValue;
            Maximum = decimal.MaxValue;
            Increment = 1;
        }
    }
    

    正如我所说,我不知道 vb.Net,但我认为这是翻译...

    Public Class MyNumericUpDown Inherits NumericUpDown
    {
        Public Sub New()
        {
            MyBase.New()
            DecimalPlaces = 2
            Minimum = decimal.MinValue
            Maximum = decimal.MaxValue
            Increment = 1   
        }
    }
    

    如果您不需要使用具有常量默认值的 NumericUpDown,那么创建自定义控件将没有价值,您应该为每个需要创建不同的对象。

        numericUpDown1 = New NumericUpDown()
    
        ' Set the Minimum, Maximum, and other values as needed.
        numericUpDown1.DecimalPlaces = 2
        numericUpDown1.Maximum = decimal.MaxValue
        numericUpDown1.Minimum = decimal.MinValue
        numericUpDown1.Increment = 1
    

    您只能使用Shadow 关键字来隐藏您派生的类的基类中的实现。

    【讨论】:

    • 嗨,哈里森,我对 C# 没问题。您的示例的问题是,在程序启动时覆盖所有 MyNumericUpDown 的设置,但并非所有 MyNumericUpDown 都没有相同的目的。我还必须输入整数,没有 DecimalPlaces,以及针对不同情况的不同属性......
    • @user973238 我以为您想创建一个具有特定属性的自定义控件以经常使用。如果没有,我不确定您在寻找什么。如果他们没有共同的任何东西,为什么不只使用基类并根据需要设置属性?
    • 我尝试这样做(根据具体需要设置不同的属性),并在我的问题中举例说明如何做到这一点,但问题是这不起作用。也许我声明和使用的属性不正确?
    • @user973238 我更新了我的答案,希望能回答你的问题。
    • 我不知道,那根本行不通。我在子类的这四个属性中使用了 shadow 关键字,但是当我将新的 myNumericUpDown 放置到 Form 时,这些属性的值不是我设置为 的值,而是来自原始 NumericUpDown 的值...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多