C# 勒瓦卢埃斯; } 设置 { 可能值=值; FillDefaultValues(); this.Value=possibleValues.Min(); } } public NumericUpdownCustom():base() { FillDefaultValues(); this.Value=PossibleValues.Min(); } 私有void FillDefaultValues(){ if(可能值==null){ 列表项=新列表(); 对于(十进制i=此最小值;i a>数字)) { this.Value=PossibleValues.Where(w=>w>number).Min(); } 其他的 { this.Value=PossibleValues.Max(); } } 公共覆盖无效下拉按钮() { if(base.UserEdit) { this.ParseEditText(); } 十进制数=(十进制)此值; if(可能的值.Any(a=>awMath.Abs((长)当前-期望值)Math.Abs((长)当前-值)w.Name==“currentValue”).FirstOrDefault(); 如果(currentValueField!=null) { currentValueField.SetValue(该值); this.Text=value.ToString(); } } }

C# 勒瓦卢埃斯; } 设置 { 可能值=值; FillDefaultValues(); this.Value=possibleValues.Min(); } } public NumericUpdownCustom():base() { FillDefaultValues(); this.Value=PossibleValues.Min(); } 私有void FillDefaultValues(){ if(可能值==null){ 列表项=新列表(); 对于(十进制i=此最小值;i a>数字)) { this.Value=PossibleValues.Where(w=>w>number).Min(); } 其他的 { this.Value=PossibleValues.Max(); } } 公共覆盖无效下拉按钮() { if(base.UserEdit) { this.ParseEditText(); } 十进制数=(十进制)此值; if(可能的值.Any(a=>awMath.Abs((长)当前-期望值)Math.Abs((长)当前-值)w.Name==“currentValue”).FirstOrDefault(); 如果(currentValueField!=null) { currentValueField.SetValue(该值); this.Text=value.ToString(); } } },c#,numericupdown,C#,Numericupdown,未完全测试(例如,使用数据绑定),但: 它使用指定的值数组 如果未设置可能的值,则将在最小值和最大值之间使用正常值 可以通过键入或编程更改值。如果可能值数组不包含给定值,则该值将是最接近的值 当以编程方式将值更改为不可能值时,将删除重复的值更改事件 问题: 当您通过键入设置不相关的值,并且控件将此值更改为最接近的值,并且此值与以前的值相等时,将触发值更改事件 用法: 将控件放置到窗体中 设置可能的值数组: NumericUpdownCustom1.PossibleValues=新的十进

未完全测试(例如,使用数据绑定),但:

  • 它使用指定的值数组
  • 如果未设置可能的值,则将在最小值和最大值之间使用正常值
  • 可以通过键入或编程更改值。如果可能值数组不包含给定值,则该值将是最接近的值
  • 当以编程方式将值更改为不可能值时,将删除重复的值更改事件
问题:

  • 当您通过键入设置不相关的值,并且控件将此值更改为最接近的值,并且此值与以前的值相等时,将触发值更改事件
用法:

  • 将控件放置到窗体中
  • 设置可能的值数组:

    NumericUpdownCustom1.PossibleValues=新的十进制[]{1,10,20,33,55}

我的自定义类:

    class NumericUpdownCustom : NumericUpDown
{
    private decimal[] possibleValues = null;

    public decimal[] PossibleValues
    {
        get
        {
            return possibleValues;
        }
        set
        {
            possibleValues = value;
            FillDefaultValues();
            this.Value = possibleValues.Min();
        }
    }

    public NumericUpdownCustom() : base()
    {
        FillDefaultValues();
        this.Value = PossibleValues.Min();    
    }

    private void FillDefaultValues() {
        if (PossibleValues == null) {
            List<decimal> items = new List<decimal>();
            for (decimal i = this.Minimum; i <= this.Maximum; i++)
            {
                items.Add(i);
            }
            PossibleValues = items.ToArray();
        }
    }

    public override void UpButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }

        decimal number = (decimal)this.Value;

        if (PossibleValues.Any(a => a > number))
        {
            this.Value = PossibleValues.Where(w => w > number).Min();
        }
        else
        {
            this.Value = PossibleValues.Max();
        }
    }

    public override void DownButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }

        decimal number = (decimal)this.Value;

        if (PossibleValues.Any(a => a < number))
        {
            this.Value = PossibleValues.Where(w => w < number).Max();
        }
        else
        {
            this.Value = PossibleValues.Min();
        }
    }

    public new decimal Value
    {
        get
        {
            decimal desiredValue = base.Value;

            if (!PossibleValues.Contains(desiredValue))
            {
                var nearest = PossibleValues.Aggregate((current, next) => Math.Abs((long)current - desiredValue) < Math.Abs((long)next - desiredValue) ? current : next);
                SetValueWithoutRaisingEvent(nearest);
            }

            return base.Value;
        }
        set
        {
            if (!PossibleValues.Contains(value))
            {
                var nearest = PossibleValues.Aggregate((current, next) => Math.Abs((long)current - value) < Math.Abs((long)next - value) ? current : next);
                base.Value = nearest;
            }
            else
            {
                if (value < this.Minimum)
                {
                    base.Value = this.Minimum;
                }
                else if (value > this.Maximum)
                {
                    base.Value = this.Maximum;
                }
                else
                {
                    base.Value = value;
                }
            }
        }
    }

    private void SetValueWithoutRaisingEvent(decimal value) {
        var currentValueField = GetType().BaseType.GetRuntimeFields().Where(w => w.Name == "currentValue").FirstOrDefault();
        if (currentValueField != null)
        {
            currentValueField.SetValue(this, value);
            this.Text = value.ToString();
        }
    }
}
class NumericUpdownCustom:NumericUpDown
{
私有十进制[]可能值=null;
公共十进制[]可能值
{
得到
{
返回可能的值;
}
设置
{
可能值=值;
FillDefaultValues();
this.Value=possibleValues.Min();
}
}
public NumericUpdownCustom():base()
{
FillDefaultValues();
this.Value=PossibleValues.Min();
}
私有void FillDefaultValues(){
if(可能值==null){
列表项=新列表();
对于(十进制i=此最小值;i a>数字))
{
this.Value=PossibleValues.Where(w=>w>number).Min();
}
其他的
{
this.Value=PossibleValues.Max();
}
}
公共覆盖无效下拉按钮()
{
if(base.UserEdit)
{
this.ParseEditText();
}
十进制数=(十进制)此值;
if(可能的值.Any(a=>awMath.Abs((长)当前-期望值)Math.Abs((长)当前-值)此最大值)
{
base.Value=此.max;
}
其他的
{
基本价值=价值;
}
}
}
}
private void SetValueWithoutRaisingEvent(十进制值){
var currentValueField=GetType().BaseType.GetRuntimeField
List<int> acceptedValues = new List<int>(){ 1, 2, 3, 4, 6, 12 };

private void numericUpDown1_KeyUp(object sender, KeyEventArgs e)
{
    int number = (int)numericUpDown1.Value;
    if (acceptedValues.Contains(number) || (number % 24 == 0))
    {
       // is good
    }
}

private void numericUpDown1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    {
       int number = numericUpDown1.Value;
       if (acceptedValues.Contains(number) || (number % 24 == 0))
       {
          // is good
       }
    }
}
class CustomNumericUpDown : NumericUpDown
{
    private int currentIndex = 0;
    private decimal[] possibleValues = null;
    public decimal[] PossibleValues
    {
        get
        {
            if (possibleValues == null)
            {
                possibleValues = GetPossibleValues().ToArray();
            }
            return possibleValues;
        }
    }

    public override void UpButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }
        var values = PossibleValues;
        this.currentIndex = Math.Min(this.currentIndex + 1, values.Length - 1);
        this.Value = values[this.currentIndex];
    }

    public override void DownButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }
        var values = PossibleValues;
        this.currentIndex = Math.Max(this.currentIndex - 1, 0);
        this.Value = values[this.currentIndex];
    }

    private IEnumerable<decimal> GetPossibleValues()
    {
        foreach (var value in new decimal[] { 1, 2, 3, 4, 6, 12 })
        {
            yield return value;
        }
        for (decimal i = 24; i < Maximum; i += 24)
        {
            yield return i;
        }
    }
}
    class NumericUpdownCustom : NumericUpDown
{
    private decimal[] possibleValues = null;

    public decimal[] PossibleValues
    {
        get
        {
            return possibleValues;
        }
        set
        {
            possibleValues = value;
            FillDefaultValues();
            this.Value = possibleValues.Min();
        }
    }

    public NumericUpdownCustom() : base()
    {
        FillDefaultValues();
        this.Value = PossibleValues.Min();    
    }

    private void FillDefaultValues() {
        if (PossibleValues == null) {
            List<decimal> items = new List<decimal>();
            for (decimal i = this.Minimum; i <= this.Maximum; i++)
            {
                items.Add(i);
            }
            PossibleValues = items.ToArray();
        }
    }

    public override void UpButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }

        decimal number = (decimal)this.Value;

        if (PossibleValues.Any(a => a > number))
        {
            this.Value = PossibleValues.Where(w => w > number).Min();
        }
        else
        {
            this.Value = PossibleValues.Max();
        }
    }

    public override void DownButton()
    {
        if (base.UserEdit)
        {
            this.ParseEditText();
        }

        decimal number = (decimal)this.Value;

        if (PossibleValues.Any(a => a < number))
        {
            this.Value = PossibleValues.Where(w => w < number).Max();
        }
        else
        {
            this.Value = PossibleValues.Min();
        }
    }

    public new decimal Value
    {
        get
        {
            decimal desiredValue = base.Value;

            if (!PossibleValues.Contains(desiredValue))
            {
                var nearest = PossibleValues.Aggregate((current, next) => Math.Abs((long)current - desiredValue) < Math.Abs((long)next - desiredValue) ? current : next);
                SetValueWithoutRaisingEvent(nearest);
            }

            return base.Value;
        }
        set
        {
            if (!PossibleValues.Contains(value))
            {
                var nearest = PossibleValues.Aggregate((current, next) => Math.Abs((long)current - value) < Math.Abs((long)next - value) ? current : next);
                base.Value = nearest;
            }
            else
            {
                if (value < this.Minimum)
                {
                    base.Value = this.Minimum;
                }
                else if (value > this.Maximum)
                {
                    base.Value = this.Maximum;
                }
                else
                {
                    base.Value = value;
                }
            }
        }
    }

    private void SetValueWithoutRaisingEvent(decimal value) {
        var currentValueField = GetType().BaseType.GetRuntimeFields().Where(w => w.Name == "currentValue").FirstOrDefault();
        if (currentValueField != null)
        {
            currentValueField.SetValue(this, value);
            this.Text = value.ToString();
        }
    }
}