datagridview中一列定义为datetime,只允许输入2012-xx-xx格式,输入其他的抛出异常,如何做? datagridview中一列定义为datetime,只允许输入2012-xx-xx格式,输入其他的抛出异常,如何做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本身列定义的为datetime类型,现在datagridview点击该列输入数值的时候,如果不是2012-00-00格式,系统会报一个好大的错误框,我想做的是如果输入不格式不对时,抛出异常。哪位能提供下代码,我菜鸟一个。 try{ DateTime date = Convert.ToDateTime(你的文本框ID.Text.Trim());}catch{ Response.Write("<script>alert('日期格式输入错误');</script>");} private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e) { if (e.ColumnIndex == 2)//时间列 { if (e.RowIndex > 0) { DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex]; if (row != null) { if (row.Cells["date"].Value != null && row.Cells["date"].Value.ToString() != "") { if (!isDateShort(row.Cells["date"].Value.ToString())) { MessageBox.Show("日期格式不正确!"); } } } } } } /// <summary> /// 判断日期的日期部分格式(yyyy-MM-dd) /// </summary> /// <param name="dateStr">输入的日期的日期部分字符串</param> public bool isDateShort(string dateStr) { return Regex.IsMatch(dateStr, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$"); } 单元格有个编辑完成事件 CellEndEdit ,方法里可以验证,但是如果抛出异常外面没法捕获,你想要的效果是提示用户输错了还是程序直接崩溃? 你可以用MaskedTextBox或者日期控件来强迫用户输入合法的日期啊? 对于字段本身就是datetime来说,如果输入的格式不正确。程序本身就报错,直到你改正为止,如下图。 对,列表中本身没有这个控件,如果字段日期字段定义为int类型的话,那么你的那段代码起效。但又衍生出另外一个问题,虽然有错误提示,但已经输入的内容还是显示在上面,如果此时按保存按钮的话,输入的内容仍然会保存在数据库中。 /// <summary> /// CellValidating事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列 if (e.ColumnIndex == dateColumnIndex) { DateTime dt; if (!DateTime.TryParse(e.FormattedValue.ToString(), out dt) || dt.Year != 2012)// 不是日期类型,又或者是时期类型,但年份不是2012 { MessageBox.Show("Error!!!");// 报个错 e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格 } } } private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e) { if (e.ColumnIndex == 2)//时间列 { if (e.RowIndex > 0) { try { } catch (Exception ) { MessageBox.Show("日期格式不正确!"); } } } } 鉴于楼主这么奇怪的要求做出的奇怪改法 /// <summary> /// CellValidating事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列 if (e.ColumnIndex == dateColumnIndex && e.FormattedValue.ToString() != string.Empty)// 当前编辑的单元格在那个列内,并且单元格里面填了文本,包括空格 { System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^2012\-\d{2}\-\d{2}$");// 正则表达式,对应楼主奇怪的要求,只能输入2012-XX-XX,而且XX必须是数字,而且不能是一个X,必须两个Xo(╯□╰)o DateTime dt; if (!regex.IsMatch(e.FormattedValue.ToString()) || !DateTime.TryParse(e.FormattedValue.ToString(), out dt))// 匹配正则失败,又或者是匹配正确,但不是时间类型 { MessageBox.Show("Error!!!");// 报个错 e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格 } } } 那就把dt.Year !=2012改成dt.Year !=DateTime.Now.Year呗…… 你的代码里我找不到在哪里改--->那就把dt.Year !=2012改成dt.Year !=DateTime.Now.Year呗…… dt.Year !=DateTime.Now.Year。怎样加到你的代码中 /// <summary> /// CellValidating事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { int year = DateTime.Now.Year;// 增加这个…… const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列 if (e.ColumnIndex == dateColumnIndex && e.FormattedValue.ToString() != string.Empty)// 当前编辑的单元格在那个列内,并且单元格里面填了文本,包括空格 { // 把正则里的2012改成year // @"^2012\-\d{2}\-\d{2}$"--》"^" + year + @"\-\d{2}\-\d{2}$" System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^" + year + @"\-\d{2}\-\d{2}$");// 正则表达式,对应楼主奇怪的要求,只能输入今年-XX-XX,而且XX必须是数字,而且不能是一个X,必须两个Xo(╯□╰)o DateTime dt; if (!regex.IsMatch(e.FormattedValue.ToString()) || !DateTime.TryParse(e.FormattedValue.ToString(), out dt))// 匹配正则失败,又或者是匹配正确,但不是时间类型 { MessageBox.Show("Error!!!");// 报个错 e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格 } } } ListView ContextMenu 小问题 使用vs2008打包,打包以后怎么生成.deploy的扩展名文件? 服务器与客户端互发消息的问题 excel 读取问题 和数据库内字段比较问题 关于datagridview,想了好久都相不出来的问题 关于C++的问题??? 软件框架(c#) 一个正则表达式问题,高分! 求助,.net如何获取x509证书中的签名值 用命令打开一个文本后,怎么可以保存文本中的不同日期,到一个数组中? 利用Jmail接收邮件
如果不是2012-00-00格式,系统会报一个好大的错误框,
我想做的是如果输入不格式不对时,抛出异常。
哪位能提供下代码,我菜鸟一个。
try{
DateTime date = Convert.ToDateTime(你的文本框ID.Text.Trim());
}catch{
Response.Write("<script>alert('日期格式输入错误');</script>");
}
{
if (e.ColumnIndex == 2)//时间列
{
if (e.RowIndex > 0)
{
DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
if (row != null)
{
if (row.Cells["date"].Value != null && row.Cells["date"].Value.ToString() != "")
{
if (!isDateShort(row.Cells["date"].Value.ToString()))
{
MessageBox.Show("日期格式不正确!");
}
}
}
}
}
}
/// <summary>
/// 判断日期的日期部分格式(yyyy-MM-dd)
/// </summary>
/// <param name="dateStr">输入的日期的日期部分字符串</param>
public bool isDateShort(string dateStr)
{
return Regex.IsMatch(dateStr, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$"); }
对于字段本身就是datetime来说,如果输入的格式不正确。程序本身就报错,直到你改正为止,如下图。
对,列表中本身没有这个控件,如果字段日期字段定义为int类型的话,那么你的那段代码起效。
但又衍生出另外一个问题,虽然有错误提示,但已经输入的内容还是显示在上面,
如果此时按保存按钮的话,输入的内容仍然会保存在数据库中。
/// <summary>
/// CellValidating事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列
if (e.ColumnIndex == dateColumnIndex)
{
DateTime dt;
if (!DateTime.TryParse(e.FormattedValue.ToString(), out dt) || dt.Year != 2012)// 不是日期类型,又或者是时期类型,但年份不是2012
{
MessageBox.Show("Error!!!");// 报个错
e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
}
}
}
private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
if (e.ColumnIndex == 2)//时间列
{
if (e.RowIndex > 0)
{
try
{ }
catch (Exception )
{
MessageBox.Show("日期格式不正确!");
} }
}
}
/// CellValidating事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列
if (e.ColumnIndex == dateColumnIndex && e.FormattedValue.ToString() != string.Empty)// 当前编辑的单元格在那个列内,并且单元格里面填了文本,包括空格
{
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^2012\-\d{2}\-\d{2}$");// 正则表达式,对应楼主奇怪的要求,只能输入2012-XX-XX,而且XX必须是数字,而且不能是一个X,必须两个Xo(╯□╰)o
DateTime dt;
if (!regex.IsMatch(e.FormattedValue.ToString()) || !DateTime.TryParse(e.FormattedValue.ToString(), out dt))// 匹配正则失败,又或者是匹配正确,但不是时间类型
{
MessageBox.Show("Error!!!");// 报个错
e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
}
}
}
你的代码里我找不到在哪里改--->那就把dt.Year !=2012改成dt.Year !=DateTime.Now.Year呗……
dt.Year !=DateTime.Now.Year。怎样加到你的代码中
/// CellValidating事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
int year = DateTime.Now.Year;// 增加这个……
const int dateColumnIndex = 0;// 设定你的那个列的序号,这里假设是第0列
if (e.ColumnIndex == dateColumnIndex && e.FormattedValue.ToString() != string.Empty)// 当前编辑的单元格在那个列内,并且单元格里面填了文本,包括空格
{
// 把正则里的2012改成year
// @"^2012\-\d{2}\-\d{2}$"--》"^" + year + @"\-\d{2}\-\d{2}$"
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^" + year + @"\-\d{2}\-\d{2}$");// 正则表达式,对应楼主奇怪的要求,只能输入今年-XX-XX,而且XX必须是数字,而且不能是一个X,必须两个Xo(╯□╰)o
DateTime dt;
if (!regex.IsMatch(e.FormattedValue.ToString()) || !DateTime.TryParse(e.FormattedValue.ToString(), out dt))// 匹配正则失败,又或者是匹配正确,但不是时间类型
{
MessageBox.Show("Error!!!");// 报个错
e.Cancel = true;// 最重要的一步,将Cancel设为true,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
}
}
}