datagridview中一列定义为datetime,只允许输入2012-xx-xx格式,输入其他的抛出异常,如何做?

解决方案 »

  1.   

    本身列定义的为datetime类型,现在datagridview点击该列输入数值的时候,
    如果不是2012-00-00格式,系统会报一个好大的错误框,
    我想做的是如果输入不格式不对时,抛出异常。
    哪位能提供下代码,我菜鸟一个。
      

  2.   


    try{
        DateTime date = Convert.ToDateTime(你的文本框ID.Text.Trim());
    }catch{
        Response.Write("<script>alert('日期格式输入错误');</script>");
    }
      

  3.   

    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-))$");        }
      

  4.   

    单元格有个编辑完成事件 CellEndEdit ,方法里可以验证,但是如果抛出异常外面没法捕获,你想要的效果是提示用户输错了还是程序直接崩溃?
      

  5.   

    你可以用MaskedTextBox或者日期控件来强迫用户输入合法的日期啊?
      

  6.   


    对于字段本身就是datetime来说,如果输入的格式不正确。程序本身就报错,直到你改正为止,如下图。
      

  7.   


    对,列表中本身没有这个控件,如果字段日期字段定义为int类型的话,那么你的那段代码起效。
    但又衍生出另外一个问题,虽然有错误提示,但已经输入的内容还是显示在上面,
    如果此时按保存按钮的话,输入的内容仍然会保存在数据库中。
      

  8.   


    /// <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,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
                    }
                }
            }
      

  9.   


    private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
            {
                if (e.ColumnIndex == 2)//时间列
                {
                    if (e.RowIndex > 0)
                    {
                          try
                {            }
                catch (Exception )
                {
                    MessageBox.Show("日期格式不正确!");
                }                }
                }
            }
      

  10.   

    鉴于楼主这么奇怪的要求做出的奇怪改法        /// <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,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
                    }
                }
            }
      

  11.   

    那就把dt.Year !=2012改成dt.Year !=DateTime.Now.Year呗……
      

  12.   


    你的代码里我找不到在哪里改--->那就把dt.Year !=2012改成dt.Year !=DateTime.Now.Year呗……
      

  13.   


    dt.Year !=DateTime.Now.Year。怎样加到你的代码中
      

  14.   

            /// <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,表示验证不通过,如果不设的话,就表示默认验证通过,就算你上面报错也没用,焦点一样会离开当前编辑的单元格
                    }
                }
            }