[高分求助]求一个自定义NumericUpDown

饺子87 2009-01-17 11:24:12
求一个自定义MyNumericUpDown,功能,假设范围[min,max],当前值value
如果点击UpDown改变数值,则有:
if(value>max)value=min;// value=max时Up
if(value<min)value=max;// value=min时Down

手动输入则不同,
输入小于min就等于min
大于max就等于max
输入空(Delete等键清除原有值)等于min.

允许显示文字.
例如:value=min时显示'关'
value=1时显示'第一个文字值'
value=2时显示'第二个文字值'
value=3时显示'第三个文字值'
...全文
531 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
饺子87 2009-01-21
  • 打赏
  • 举报
回复
请原谅我的资质愚钝,我终于弄动了10楼的意思...
chagel 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Sader_L 的回复:]
C# codeprotectedoverridevoidValidateEditText() { }privatestringFormatText(decimalvalue)
{if(this.Minimum==value)return"关闭";returnstring.Format("第{0}个数字", value);
}
10楼补充的以上重载可以实现功能了,
可是把文本直接写死在方法里实在不妥,
毕竟要考虑多国语言环境以及不同的文字替换需求,
能否有一个属性设置value和Text的对应关系?
比如if(value==0)text=OFF;
[/Quote]

楼主,我在回答里面说过你如果重写Text这个属性的话,可以在引用控件的时候初始化具体值。
如果文本变化很经常的话,就不要封装在控件中,可以在外面写一个模板方法来利用value和text属性格式化。
或者可以放到一个配置文件也可以,这样多语言考虑的时候就比较方便了。
abcniu 2009-01-20
  • 打赏
  • 举报
回复
例如:value=min时显示'关'
value=1时显示'第一个文字值'
value=2时显示'第二个文字值'
value=3时显示'第三个文字值'

不明白你的文本是怎么显示的,什么意思,是说你要设一个text然后,根据value显示第几个位置的文字吗,

给你一个方法,可以实现你的东西
定义一个字符串 private string showtext;
把它定义成属性,
重写控件的text该方法
public override string Text
{
get
{

}
set
{
base.Text = value;
}
}
就可以了
饺子87 2009-01-20
  • 打赏
  • 举报
回复
没有满意答案,最后顶一次.明天结帖回家过年
饺子87 2009-01-20
  • 打赏
  • 举报
回复
估计又黄了,谁给我个完整的啊
饺子87 2009-01-20
  • 打赏
  • 举报
回复
不懂
悔说话的哑巴 2009-01-19
  • 打赏
  • 举报
回复
饺子87 2009-01-19
  • 打赏
  • 举报
回复
谁不是学出来的?
饺子87 2009-01-19
  • 打赏
  • 举报
回复
12楼的前辈能不能看下这帖?
我把你的代码复制粘贴了变量命都没有了.......
http://www.codeproject.com/KB/vb/UpDownEx_with_measure.aspx
饺子87 2009-01-19
  • 打赏
  • 举报
回复

protected override void ValidateEditText() { }
private string FormatText(decimal value)
{
if (this.Minimum == value)
return "关闭";
return string.Format("第{0}个数字", value);
}

10楼补充的以上重载可以实现功能了,
可是把文本直接写死在方法里实在不妥,
毕竟要考虑多国语言环境以及不同的文字替换需求,
能否有一个属性设置value和Text的对应关系?
比如if(value==0)text=OFF;
sxmonsy 2009-01-19
  • 打赏
  • 举报
回复

private void Format()
{
string str_Format = null;
if (UpDown.Value == int_Factor * (int_UnitsActual) & int_UnitsActual > 0) {
int_UnitsActual -= 1;
UpDown.Value -= 1;
UpDown.DecimalPlaces -= 1;
}
else if (UpDown.Value == int_Factor * (int_UnitsActual + 1) & int_UnitsActual < str_Units.Length) {
int_UnitsActual += 1;
UpDown.Value += 1;
UpDown.DecimalPlaces += 1;
}
UpDown.Increment = dbl_Decimals(UpDown.DecimalPlaces);
int i = 0;
str_Format = "#,";
for (i = 0; i <= UpDown.DecimalPlaces - 1; i++) {
str_Format += "#";
}
str_Format += "0.";
for (i = 0; i <= UpDown.DecimalPlaces - 1; i++) {
str_Format += "0";
}
dbl_Value = UpDown.Value - (int_Factor * int_UnitsActual);
this.TextControl.Text = dbl_Value.ToString(str_Format) + " " + str_Units(int_UnitsActual);
}


饺子87 2009-01-19
  • 打赏
  • 举报
回复

Private Sub Format()
Dim str_Format As String
If UpDown.Value = int_Factor * (int_UnitsActual) And int_UnitsActual > 0 Then
int_UnitsActual -= 1
UpDown.Value -= 1
UpDown.DecimalPlaces -= 1
ElseIf UpDown.Value = int_Factor * (int_UnitsActual + 1) And int_UnitsActual < str_Units.Length Then
int_UnitsActual += 1
UpDown.Value += 1
UpDown.DecimalPlaces += 1
End If
UpDown.Increment = dbl_Decimals(UpDown.DecimalPlaces)
Dim i As Integer
str_Format = "#,"
For i = 0 To UpDown.DecimalPlaces - 1
str_Format += "#"
Next
str_Format += "0."
For i = 0 To UpDown.DecimalPlaces - 1
str_Format += "0"
Next
dbl_Value = UpDown.Value - (int_Factor * int_UnitsActual)
Me.TextControl.Text = dbl_Value.ToString(str_Format) & " " & str_Units(int_UnitsActual)
End Sub


把以上VB代码翻译成C#代码即可得分,先到先得.
阿牛138588 2009-01-19
  • 打赏
  • 举报
回复
这么简单的控件自己都不弄,汗一个
饺子87 2009-01-19
  • 打赏
  • 举报
回复
楼上这位能解释下你发的啥吗?
wangping_li 2009-01-19
  • 打赏
  • 举报
回复

private void Format()
{
string str_Format = null;
if (UpDown.Value == int_Factor * (int_UnitsActual) & int_UnitsActual > 0) {
int_UnitsActual -= 1;
UpDown.Value -= 1;
UpDown.DecimalPlaces -= 1;
}
else if (UpDown.Value == int_Factor * (int_UnitsActual + 1) & int_UnitsActual < str_Units.Length) {
int_UnitsActual += 1;
UpDown.Value += 1;
UpDown.DecimalPlaces += 1;
}
UpDown.Increment = dbl_Decimals(UpDown.DecimalPlaces);
int i = 0;
str_Format = "#,";
for (i = 0; i <= UpDown.DecimalPlaces - 1; i++) {
str_Format += "#";
}
str_Format += "0.";
for (i = 0; i <= UpDown.DecimalPlaces - 1; i++) {
str_Format += "0";
}
dbl_Value = UpDown.Value - (int_Factor * int_UnitsActual);
this.TextControl.Text = dbl_Value.ToString(str_Format) + " " + str_Units(int_UnitsActual);
}

饺子87 2009-01-19
  • 打赏
  • 举报
回复
以下是我目前学习整理出来的实现方法,有两个问题没有解决.
首先文字写死很不合理,这且不说,第一次加载时Text默认值是并没有经过FormatText处理...
请高手指教~


/// <summary>
/// 步进框
/// 功能:循环递增\减数字
/// </summary>
public class BeiFengNumericUpDown : NumericUpDown
{
protected override void ValidateEditText() { }
private string FormatText(decimal value)
{
if ((this.Minimum == value) && TextFlg)
return "关闭";
//return string.Format("第{0}个数字", value);
}

public override void UpButton()
{
decimal value = this.Value;
value = value + this.Increment;
if (value > this.Maximum)
{
value = this.Minimum;
}
this.Value = value;
}

public override void DownButton()
{
decimal value = this.Value;
value = value - this.Increment;
if (value < this.Minimum)
{
value = this.Maximum;
}
this.Value = value;
}

protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);

decimal value = this.Value;
if (value != this.Minimum)
{
this.Value = this.Minimum;
}
else
{
this.Value = this.Maximum;
}
this.Value = value;
}
}
EvadeLove 2009-01-19
  • 打赏
  • 举报
回复
学习
饺子87 2009-01-19
  • 打赏
  • 举报
回复
到底咋办呢...
chagel 2009-01-18
  • 打赏
  • 举报
回复
http://www.cnprog.com/questions/25/如何重写NumericUpDown控件使能够显示非数字格式的文本?
饺子87 2009-01-18
  • 打赏
  • 举报
回复
今年要到农历28才可以走人55555
加载更多回复(8)

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧