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();
}
}
}