我写的代码实在是太罗嗦了,麻烦大家帮我改一下,谢谢了
首先说说要实现的功能,窗体上就四个组合框,存放年份和月份
目的是让用户选择查询的起始年月和终止年月。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;
}
首先说说要实现的功能,窗体上就四个组合框,存放年份和月份
目的是让用户选择查询的起始年月和终止年月。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;
}
CustomFormat属性设置为:yyyy-MM不是就达到目的了吗?写这么多代码干什么!呵呵
DateTimePicker1.CustomFormat = "yyyy年MM月";
DateTimePicker1.Format = DateTimePickerFormat.Custom;
用 dateTimePicker 控件Format属性设置为:Custom
CustomFormat属性设置为:yyyy-MM
ShowUpDown属性设置为:true你去试试,看看是不是你需要的结果
我就是遇到过这个问题,所以不想用日期控件了。
另外,设置格式为 yyyy-MM 后,只能让用户输入数字了,如果选择的话,只能一个月一个月的选,用户感觉不如用组合框选择方便。这也是原因之一。
CustomFormat属性设置为:yyyy-MM
ShowUpDown属性设置为:true你去试试,看看是不是你需要的结果
-----------------------------------------
我是这样用过,可是日期如何处理呢?这个控件总有一个日期在背后呀,如果这个日期值是31号,可是月份选到2月份,就会出现错误呀,我曾要遇到过,但没想如何解决。大家都说用 datetimepicker ,我也想用,毕竟省事,可是两个问题。
1.日期如何处理,总是存在的呀????
2.用户只能录入数字了,或者用鼠标一下一下的点,没有用组合框选着方便。
1.日期如何处理,总是存在的呀????年值:dateTimePicker1.Value.Year
月值:dateTimePicker1.Value.Month
2.用户只能录入数字了,或者用鼠标一下一下的点,没有用组合框选着方便。这个选择不是很方便吗?点年选年,点月选月
和用户沟通一样,这种选择用户应该可接受我现在的项目这样做的,用户却认为很方便
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为月,我的月是写死的,不过你可以参照年的写法动态添加月.
{
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;
}
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();
}
缩短变量的生命周期,比如strmoney如果一定要声明的话,也应该放在最后,而不是开头
把变量用个解释性变量或是解释性方法取代,比如把flag变成了YearExsited
对于设置状态的“可以”(不是必须的)来个方法 比如this.WindowState = FormWindowState.Maximized;变成了ResizeWindowToMaxSize();
for换成foreach,这里我并没有换,楼主自己去换吧
抽取方法 ,我改完的例子里,还可以抽出一个方法 ,楼主自己试试
关于如何写出可读强的代码,推荐楼主看《代码大全》《重构》《实现模式》《.NET设计规范》
设置文本框的readonly属性就不能修改了。
如果想让用户修改,可以验证他输入的内容,你只要try..catch一下不能转换为日期就返回个错误
你试下DateTime.Parse("2010-02-30");或者Convert.ToDateTime就知道了,它会报错的:该字符串未被识别为有效的 DateTime。
既然楼主认为组合框好,那就回到正题吧。
不必循环找到值的,组合框可以用.Items.Contains(...);来确认是否存在某项
DropDownList可以用.Items.FindByValue(...)查找值