我写的代码实在是太罗嗦了,麻烦大家帮我改一下,谢谢了
首先说说要实现的功能,窗体上就四个组合框,存放年份和月份
目的是让用户选择查询的起始年月和终止年月。cboyear1
cboyear2 这两个存放年份,在设计期添加的字符串为2008
2009
2010
2011
2012
2013cbomonth1,cbomonth2 这两个存放月份字符串,在设计期添加的字符串为01
02
03
04
05
06
07
08
09
10
11
12我想实现,窗体启动时,取系统时间,然后将 组合框 cboyear1,cboyear2的当前值设置为系统日期的当前年度。
将组合框 cbomonth1,cbomonth2的当前值设置为系统日期的当前月份,请问如何可以实现呢?我下面的代码,自感太多了,太不优化了,请大家帮我改一下。
另外,我的主体思路有问题吗?
以下我贴的代码,是窗体的load事件,请大家帮我改一下,谢谢了        private void Frmgjj_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
            int flag=0;     //在年份组合框中是否找到某个“年度字符串”的标志,1表示找到了,0表示组合框中没有这个年度
            DateTime dt = DateTime.Now; //获取系统时间,目的是设置年份和月份组合框
            string stryear,strmonth;    //保存年份和月份的字符串变量
            stryear=dt.Year.ToString();
            strmonth = dt.Month.ToString().PadLeft(2,'0');      //保证月份是2位显示            for (int i = 0; i < cboyear1.Items.Count; i++)
            {
                if (stryear == cboyear1.Items[i].ToString())
                {
                    flag = 1;       //找到了年份字符串就退了循环
                    break;
                }
            }            if (flag == 1)
                cboyear1.Text = stryear;    //此时组合框中存在该年份,就直接将该年份设置为当前组合框的值
            else
            {
                cboyear1.Items.Add(stryear);    //如果组合框中不存在,就先添加这个字符串
                cboyear1.Text = stryear;        //将组合框的当前值,设置为刚刚添加的年份字符串
            }            cbomonth1.Text = "01";            flag = 0;   //标志清0
            for (int i = 0; i < cboyear2.Items.Count; i++)
            {
                if (stryear == cboyear2.Items[i].ToString())
                {
                    flag = 1;
                    break;
                }
            }            if (flag == 1)
                cboyear2.Text = stryear;
            else
            {
                cboyear2.Items.Add(stryear);
                cboyear2.Text = stryear;
            }            cbomonth2.Text = strmonth;
        }

解决方案 »

  1.   

    用 dateTimePicker 控件Format属性设置为:Custom
    CustomFormat属性设置为:yyyy-MM不是就达到目的了吗?写这么多代码干什么!呵呵
      

  2.   

    DateTimePicker控件,设置2个属性:
    DateTimePicker1.CustomFormat = "yyyy年MM月";
    DateTimePicker1.Format = DateTimePickerFormat.Custom;
      

  3.   


    用 dateTimePicker 控件Format属性设置为:Custom
    CustomFormat属性设置为:yyyy-MM
    ShowUpDown属性设置为:true你去试试,看看是不是你需要的结果
      

  4.   

    还有一个原因,这样是不显示日期,但是这个控件背后总有一个日期呀。比如这个日期是31号,但是月份我选到2月份,就会出错。因为2月没有31号。
    我就是遇到过这个问题,所以不想用日期控件了。
    另外,设置格式为 yyyy-MM 后,只能让用户输入数字了,如果选择的话,只能一个月一个月的选,用户感觉不如用组合框选择方便。这也是原因之一。
      

  5.   

    用 dateTimePicker 控件Format属性设置为:Custom
    CustomFormat属性设置为:yyyy-MM
    ShowUpDown属性设置为:true你去试试,看看是不是你需要的结果
    -----------------------------------------
    我是这样用过,可是日期如何处理呢?这个控件总有一个日期在背后呀,如果这个日期值是31号,可是月份选到2月份,就会出现错误呀,我曾要遇到过,但没想如何解决。大家都说用 datetimepicker ,我也想用,毕竟省事,可是两个问题。
    1.日期如何处理,总是存在的呀????
    2.用户只能录入数字了,或者用鼠标一下一下的点,没有用组合框选着方便。
      

  6.   

    大家都说用 datetimepicker ,我也想用,毕竟省事,可是两个问题。
    1.日期如何处理,总是存在的呀????年值:dateTimePicker1.Value.Year  
    月值:dateTimePicker1.Value.Month
    2.用户只能录入数字了,或者用鼠标一下一下的点,没有用组合框选着方便。这个选择不是很方便吗?点年选年,点月选月
    和用户沟通一样,这种选择用户应该可接受我现在的项目这样做的,用户却认为很方便
      

  7.   

     //邦定时间
            private void BindTime()
            {
                drpdate.Items.Clear();
                int pyear = DateTime.Now.Year;
                int pmonth = DateTime.Now.Month;
                for (int i = pyear - 4; i <= pyear; i++)
                {
                    ListItem li = new ListItem();
                    li.Value = i.ToString();
                    li.Text = i.ToString();
                    drpdate.Items.Add(li);
                }
                drpdate.SelectedValue = pyear.ToString();
                         
                    if (pmonth.ToString().Length == 1)
                    {
                        drpdatemonth.SelectedValue = "0" + pmonth.ToString();
                    }
                    else
                    {
                        drpdatemonth.SelectedValue = pmonth.ToString();
                    }
                }
      用两个下拉列表框,drpdate为年,drpdatemonth为月,我的月是写死的,不过你可以参照年的写法动态添加月.
      

  8.   

    简单改了一下private void Frmgjj_Load(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;
                DateTime dt = DateTime.Now; //获取系统时间,目的是设置年份和月份组合框
                string stryear, strmonth;    //保存年份和月份的字符串变量
                stryear = dt.Year.ToString();
                strmonth = dt.Month.ToString().PadLeft(2, '0');      //保证月份是2位显示            if (cboyear1.FindString(stryear) >= 0)
                {
                    cboyear1.Text = stryear;    //此时组合框中存在该年份,就直接将该年份设置为当前组合框的值
                }
                else
                {
                    cboyear1.Items.Add(stryear);    //如果组合框中不存在,就先添加这个字符串
                    cboyear1.Text = stryear;        //将组合框的当前值,设置为刚刚添加的年份字符串
                }            cbomonth1.Text = "01";            
                
                if (cboyear2.FindString(stryear) >= 0)
                {
                    cboyear2.Text = stryear;
                }
                else
                {
                    cboyear2.Items.Add(stryear);
                    cboyear2.Text = stryear;
                }            cbomonth2.Text = strmonth;
            }
      

  9.   

    用DateTimePicker控件     楼主还不结贴!
      

  10.   


    void ResizeWindowToMaxSize(){this.WindowState = FormWindowState.Maximized;}
    //combox中是否存在指定年
    Boolean YearExisted(Int32 year,ComboBox cmb)
    {
                 for (int i = 0; i < cmb.Items.Count; i++)
                {
                    if (year == Convert.ToInt32(cmb.Items[i])) return true;
                }   return false;
    }private void Frmgjj_Load(object sender, EventArgs e)
            {
                ResizeWindowToMaxSize();
                
                Int32 currentYear = DateTime.Now.Year;
                if (YearExisted(currentYear,cboyear1))
                {
                    cboyear1.Text = currentYear.ToString();    //此时组合框中存在该年份,就直接将该年份设置为当前组合框的值
                }
                else
                {
                    cboyear1.Items.Add(currentYear.ToString());    //如果组合框中不存在,就先添加这个字符串
                    cboyear1.Text = currentYear.ToString();        //将组合框的当前值,设置为刚刚添加的年份字符串
                }            cbomonth1.Text = "01";            if (YearExisted(currentYear,cboyear1))
                {
                    cboyear2.Text = currentYear.ToString();
                }
                else
                {
                    cboyear2.Items.Add(currentYear.ToString());
                    cboyear2.Text = currentYear.ToString();
                }            cbomonth2.Text = DaetTime.Now.Money.ToString();
            }
      

  11.   

    优化代码最基本的原则是删除没用的临时变量,如strmonth 
    缩短变量的生命周期,比如strmoney如果一定要声明的话,也应该放在最后,而不是开头
    把变量用个解释性变量或是解释性方法取代,比如把flag变成了YearExsited
    对于设置状态的“可以”(不是必须的)来个方法 比如this.WindowState = FormWindowState.Maximized;变成了ResizeWindowToMaxSize();
    for换成foreach,这里我并没有换,楼主自己去换吧
    抽取方法 ,我改完的例子里,还可以抽出一个方法 ,楼主自己试试
    关于如何写出可读强的代码,推荐楼主看《代码大全》《重构》《实现模式》《.NET设计规范》
      

  12.   

    修正下cbomonth2.Text = DaetTime.Now.ToString("MM");
      

  13.   

    楼主想多了。。
    设置文本框的readonly属性就不能修改了。
    如果想让用户修改,可以验证他输入的内容,你只要try..catch一下不能转换为日期就返回个错误
    你试下DateTime.Parse("2010-02-30");或者Convert.ToDateTime就知道了,它会报错的:该字符串未被识别为有效的 DateTime。
    既然楼主认为组合框好,那就回到正题吧。
    不必循环找到值的,组合框可以用.Items.Contains(...);来确认是否存在某项
    DropDownList可以用.Items.FindByValue(...)查找值