跳不出递归,找高手帮忙。。。

吖达 2013-09-03 09:30:32
//选择日期时触发
private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args)
{

Control control = (Control)obj;
bool bb = false;
Control cl = new Control();
foreach (Control ctl in this.Controls)
{
bb = quchu(ctl, control);
cl = ctl;
}
if (bb)
{
((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd");
}
}

//通过递归找到对应的控件
private bool quchu(Control ctls,Control control)
{
if (ctls is TextBox)
{
if (((TextBox)ctls).Name == control.Tag.ToString())
{
return true; //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法
}
}
else if (ctls.HasChildren)
{
foreach (Control ctl in ctls.Controls)
{
quchu(ctl, control);
}
}
return false;
}

求高手帮忙解决,已经纠结一天了,在线等。。。
...全文
178 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lele_nancy 2013-09-03
  • 打赏
  • 举报
回复
这样看看能用不

Control cl;
        private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args)
        {

            Control control = (Control)obj;
            bool bb = false;
            cl = new Control();
            foreach (Control ctl in this.Controls)
            {
                bb = quchu(ctl, control);
                //cl = ctl;
            
                if (bb)
                {
                    ((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd");
                }
            }
        }

        //通过递归找到对应的控件
        private bool quchu(Control ctls, Control control)
        {
            if (ctls is TextBox)
            {
                if (((TextBox)ctls).Name == control.Tag.ToString())
                {
                    cl = ctls;
                    return true;   //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法
                }
            }
            else if (ctls.HasChildren)
            {
                foreach (Control ctl in ctls.Controls)
                {
                    var bret = quchu(ctl, control);
                    if (bret) { return bret; }
                }
            }
            return false;
        }
吖达 2013-09-03
  • 打赏
  • 举报
回复
引用 7 楼 trustin 的回复:
上面有地方忘了改了


//选择日期时触发
private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
            
    Control control = (Control)obj;
    Control cl = null;
    foreach (Control ctl in this.Controls) 
    {
        Control bb = quchu(ctl, control);
        if(bb!=null)
		{
			cl = bb;
			break;
		}
	}
    if (c1!=null)
    {
        ((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd");
    }
}

 //通过递归找到对应的控件
private Control quchu(Control ctls,Control control)
{
    Control rectrl =null
    if (ctls is TextBox)
    {
        if (((TextBox)ctls).Name == control.Tag.ToString())
        {
             rectrl = ctls;   //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法
         }
    }
	else if (ctls.HasChildren)
    {
         foreach (Control ctl in ctls.Controls)
         {
            rectrl =quchu(ctl, control);
			if(rectrl!=null)
				break;
         }
    }
    
	return rectrl;
}
哥 我自己搞定了 不过还是谢谢你,方法跟你这种差不多一样 就是取消之前那个bool的全局变量,换成了Control类型的变量,初始值为null,当匹配到一样的时候才将值赋给他,然后始终返回它这个值,这样的话无论它怎么递归都改变不了那个值了,谢谢了哈!!!
trustin 2013-09-03
  • 打赏
  • 举报
回复
上面有地方忘了改了


//选择日期时触发
private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
            
    Control control = (Control)obj;
    Control cl = null;
    foreach (Control ctl in this.Controls) 
    {
        Control bb = quchu(ctl, control);
        if(bb!=null)
		{
			cl = bb;
			break;
		}
	}
    if (c1!=null)
    {
        ((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd");
    }
}

 //通过递归找到对应的控件
private Control quchu(Control ctls,Control control)
{
    Control rectrl =null
    if (ctls is TextBox)
    {
        if (((TextBox)ctls).Name == control.Tag.ToString())
        {
             rectrl = ctls;   //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法
         }
    }
	else if (ctls.HasChildren)
    {
         foreach (Control ctl in ctls.Controls)
         {
            rectrl =quchu(ctl, control);
			if(rectrl!=null)
				break;
         }
    }
    
	return rectrl;
}
trustin 2013-09-03
  • 打赏
  • 举报
回复
逻辑问题

//选择日期时触发
private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
            
    Control control = (Control)obj;
    bool bb = false;
    Control cl = new Control();
    foreach (Control ctl in this.Controls) 
    {
        Control bb = quchu(ctl, control);
        if(bb!=null)
		{
			cl = bb;
			break;
		}
	}
    if (bb)
    {
        ((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd");
    }
}

 //通过递归找到对应的控件
private Control quchu(Control ctls,Control control)
{
    Control rectrl =null
    if (ctls is TextBox)
    {
        if (((TextBox)ctls).Name == control.Tag.ToString())
        {
             rectrl = ctls;   //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法
         }
    }
	else if (ctls.HasChildren)
    {
         foreach (Control ctl in ctls.Controls)
         {
            rectrl =quchu(ctl, control);
			if(rectrl!=null)
				break;
         }
    }
    
	return rectrl;
}
xiaogui340 2013-09-03
  • 打赏
  • 举报
回复
递归写的有问题,如果先执行的是foreach,当然 //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法 foreach (Control ctl in ctls.Controls) { //在这里要作个判断 quchu(ctl, control); }
搬砖的码农 2013-09-03
  • 打赏
  • 举报
回复
引用 楼主 u011281141 的回复:
//选择日期时触发 private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) { foreach (Control ctl in this.Controls) { bb = quchu(ctl, control); cl = ctl; if (bb) { ((TextBox)cl).Text = args.Start.ToString("yyyy-MM-dd"); break; } } } if (((TextBox)ctls).Name == control.Tag.ToString()) { return true; //经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法 } }
“经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法”那是因为上面的foreach循环还没结束,所以在你返回true时你没有终结上面的foreach,所以quchu方法还会继续调用运行;你可要试试在上面的foreach循环里把判断加进去并跳出循环
吖达 2013-09-03
  • 打赏
  • 举报
回复
有没有人可以搭救啊,跪求帮忙啊
吖达 2013-09-03
  • 打赏
  • 举报
回复
引用 1 楼 gomoku 的回复:
给控件赋值,没有必要用递归来做。 直接赋值,代码更清晰,更容易维护,比如:

private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
   this.myTextBox.Text = args.Start.ToString("yyyy-MM-dd");
}
这个我不是针对单一的一个文本框控件的,是有很多文本框控件要共用此事件。
gomoku 2013-09-03
  • 打赏
  • 举报
回复
给控件赋值,没有必要用递归来做。 直接赋值,代码更清晰,更容易维护,比如:

private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
   this.myTextBox.Text = args.Start.ToString("yyyy-MM-dd");
}

110,534

社区成员

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

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

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