当前位置:编程学习 > C#/ASP.NET >>

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

//选择日期时触发
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;
}

求高手帮忙解决,已经纠结一天了,在线等。。。 递归 c#  winform --------------------编程问答-------------------- 给控件赋值,没有必要用递归来做。
直接赋值,代码更清晰,更容易维护,比如:

private void MonthCalendar_DateChanged(object obj, DateRangeEventArgs args) 
{
   this.myTextBox.Text = args.Start.ToString("yyyy-MM-dd");
}
--------------------编程问答--------------------
引用 1 楼 gomoku 的回复:
给控件赋值,没有必要用递归来做。
直接赋值,代码更清晰,更容易维护,比如:

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


这个我不是针对单一的一个文本框控件的,是有很多文本框控件要共用此事件。 --------------------编程问答-------------------- 有没有人可以搭救啊,跪求帮忙啊 --------------------编程问答--------------------
引用 楼主 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循环里把判断加进去并跳出循环 --------------------编程问答-------------------- 递归写的有问题,如果先执行的是foreach,当然
//经过调试,程序进入到这个地方返回true,但是跳出此方法之后还是会继续执行下面foreach中的quchu(ctl, control)方法


foreach (Control ctl in ctls.Controls)
{
   //在这里要作个判断
   quchu(ctl, control);
} --------------------编程问答-------------------- 逻辑问题

//选择日期时触发
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;
}
--------------------编程问答-------------------- 上面有地方忘了改了



//选择日期时触发
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;
}
--------------------编程问答--------------------
引用 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,当匹配到一样的时候才将值赋给他,然后始终返回它这个值,这样的话无论它怎么递归都改变不了那个值了,谢谢了哈!!! --------------------编程问答-------------------- 这样看看能用不

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;
        }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,