怎么这个也会递归或循环?

Sharpend 2013-07-07 12:16:10
怎么这个也会递归或循环?
可是我怎么想,应该不会有问题哈...


这是界面,我想把人的年龄限制,所以我用NumericUpAndDown去做.
但是我又想方便滚动,也就是说,可以双向滚动.
我把年龄限制为 [1,150]之间.于是这样:
private void numUpDownAge_ValueChanged(object sender, EventArgs e) {
numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1;
}
//但是每次运行的时候,都是 StackOverflow...内存溢出
...全文
352 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
写错...14 楼 加 1 又行不通...
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 19 楼 zjzhong 的回复:
在设置值前加一个条件判断一下,只有在值小于0和大于149时才重新计算就可以了。不然的话当然要死循环了。
你是说,对于值"0"和"149"进行独立处理?
private void numUpDownAge_ValueChanged(object sender, EventArgs e) {
            if(numUpDownAge.Value == 0)
                numUpDownAge.Value = 1;
            else
                numUpDownAge.Value = (numUpDownAge.Value + 150) % 150;
        }
想是可以,但是这貌似又触发 Value_Changed事件. 行不通...像 14楼说的,貌似 也可以...但是在后面加 0 又行不通....
zjzhong 2013-07-08
  • 打赏
  • 举报
回复
在设置值前加一个条件判断一下,只有在值小于0和大于149时才重新计算就可以了。不然的话当然要死循环了。
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
放在这两个事件是一样的...
Regan-lin 2013-07-07
  • 打赏
  • 举报
回复
好像这个NumericUpAndDown这个控件用的是小数类型的!
人生导师 2013-07-07
  • 打赏
  • 举报
回复
内存溢出一般是出现死循环了,你可以debug测试下是否numUpDownAge_ValueChanged这个事件被一直触发了,如果是会一直触发然后再找原因的
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
补充一下.我在界面中,吧 numUpDownAge(NumericUpAndDowm)最小值为 -1,最大值为 150.
wodiaozuida1234565 2013-07-07
  • 打赏
  • 举报
回复
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
引用 15 楼 dongxinxi 的回复:
else { _revising = true; 先置标记 numUpDownAge.Value = (numUpDownAge.Value + 150) % 150; }
就是
numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1;
的时候不行,这样的区间是[0,149],我不想要0. 但是,加一之后又变成 step 是 2...哎... 如果像你说的, numUpDownAge.Value = (numUpDownAge.Value + 150) % 150;这样的话, 不用在Value_Changed事件中写...直接在 Click事件就可以了...
private void numUpDownAge_Click(object sender, EventArgs e) {
            numUpDownAge.Value = (numUpDownAge.Value + 150) % 150;
        }
  • 打赏
  • 举报
回复
else { _revising = true; 先置标记 numUpDownAge.Value = (numUpDownAge.Value + 150) % 150; }
  • 打赏
  • 举报
回复
值改变了就会再次触发那事件,死循环 看看有没有别的事件 或者自个儿在方法外面定义个状态标记
//赋值后会有事件引发的标记
if(_revising)
{
    _revising = false;   //重置事件处理标记
}
//第一次(用户)触发走你的处理
else
{     
      numUpDownAge.Value = (numUpDownAge.Value + 150) % 150;
     _revising = true;
}
tcmakebest 2013-07-07
  • 打赏
  • 举报
回复
这个不是递归,而是死循环,值被改变的事件中,再次改变了值,又触发事件,导致没完没了。
Regan-lin 2013-07-07
  • 打赏
  • 举报
回复
引用 11 楼 Sharpend 的回复:
[quote=引用 9 楼 u011130289 的回复:] 这个控件不能手动输入值的,只能再控件的那个上下点击增加减少,如果你要手动输入,那你重写这个控件吧
貌似你都不是很清楚我们在说什么... 现在的情况是,我只能这样: numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 也就是说像 5 楼说的...这样增值会触发 Value_Changed事件...这样的话...我只能这么写... 1)但是值是 [0,149]...不能是我要的 [1,150]. 2)现在还有的是,当我按到"-1"值时,是有闪动,也短暂出现原来的值"-1",然后迅速回到我们想要的值"149"...我不懂怎么去掉这个闪动的过程.. 目前就这两个问题.[/quote] 我以为你是手动输入值呢
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
引用 9 楼 u011130289 的回复:
这个控件不能手动输入值的,只能再控件的那个上下点击增加减少,如果你要手动输入,那你重写这个控件吧
貌似你都不是很清楚我们在说什么... 现在的情况是,我只能这样: numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 也就是说像 5 楼说的...这样增值会触发 Value_Changed事件...这样的话...我只能这么写... 1)但是值是 [0,149]...不能是我要的 [1,150]. 2)现在还有的是,当我按到"-1"值时,是有闪动,也短暂出现原来的值"-1",然后迅速回到我们想要的值"149"...我不懂怎么去掉这个闪动的过程.. 目前就这两个问题.
本拉灯 2013-07-07
  • 打赏
  • 举报
回复
引用 楼主 Sharpend 的回复:
怎么这个也会递归或循环? 可是我怎么想,应该不会有问题哈... 这是界面,我想把人的年龄限制,所以我用NumericUpAndDown去做. 但是我又想方便滚动,也就是说,可以双向滚动. 我把年龄限制为 [1,150]之间.于是这样:
private void numUpDownAge_ValueChanged(object sender, EventArgs e) {
            numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1;
        }
//但是每次运行的时候,都是 StackOverflow...内存溢出
要这样写就不会了,


private void numUpDownAge_ValueChanged(object sender, EventArgs e) {
            numUpDownAge.ValueChanged-=new EventHandler(numUpDownAge_ValueChanged);
            numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1;
            numUpDownAge.ValueChanged+=new EventHandler(numUpDownAge_ValueChanged);
        }

知道为啥么。。。给高分就跟你说原因。
Regan-lin 2013-07-07
  • 打赏
  • 举报
回复
这个控件不能手动输入值的,只能再控件的那个上下点击增加减少,如果你要手动输入,那你重写这个控件吧
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
引用 3 楼 u011130289 的回复:
好像这个NumericUpAndDown这个控件用的是小数类型的!
是decimal类型哈...和这个没有关系的...
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
引用 5 楼 zhengceHH 的回复:
难道 numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1; 触发了numUpDownAge_ValueChanged事件,那就是递归了,来个断点就清楚了
对哈...是发生了...值变了就触发了...那怎么办哈..放在Changed事件又递归..但是别的事件又不行..
Sharpend 2013-07-07
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
int v = numUpDownAge.Value; numUpDownAge.Value = (v + 150) % 150 + 1; 这样呢?
这种歌分步的...我当然也试过... 现在的情况是..Changed事件肯定会发生,但是不懂为什么,他的值不断的增大...
喂大的程序员 2013-07-07
  • 打赏
  • 举报
回复
难道 numUpDownAge.Value = (numUpDownAge.Value + 150) % 150 + 1; 触发了numUpDownAge_ValueChanged事件,那就是递归了,来个断点就清楚了
加载更多回复(1)

110,580

社区成员

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

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

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