Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在datagridview中将日期列更新为自定义格式?-c#_C#_Date_Datetime_Datagridview - Fatal编程技术网

如何在datagridview中将日期列更新为自定义格式?-c#

如何在datagridview中将日期列更新为自定义格式?-c#,c#,date,datetime,datagridview,C#,Date,Datetime,Datagridview,在datagridview中,我显示了MySql数据库中的几个字段 其中一个字段是日期类型。 我在datagridview中将日期列显示为自定义格式,即dd/MM/yyyy dataGridView1.Columns["DATE"].DefaultCellStyle.Format = "dd/MM/yyyy"; The following exception occurred in the DataGridView System.FormatException: Strin

在datagridview中,我显示了MySql数据库中的几个字段

其中一个字段是日期类型。 我在datagridview中将日期列显示为自定义格式,即dd/MM/yyyy

        dataGridView1.Columns["DATE"].DefaultCellStyle.Format = "dd/MM/yyyy";
The following exception occurred in the DataGridView


System.FormatException: String was not recognized as a valid DateTime.

at System.DateTimeParse.Parse(String s, DateTimeFormat dtfi,DateTimeStyles styles)

at System.DateTime.Parse(String s, IFormatProvider provider)
这里我使用CommandBuilder从datagridview更新数据库

当我想要编辑日期列时,我以MM/dd/yyyy格式输入日期。它起作用了

但是我需要从datagridview更新dd/MM/yyyy格式的日期列。 如果这样做,我将从datagridview中获得以下异常

        dataGridView1.Columns["DATE"].DefaultCellStyle.Format = "dd/MM/yyyy";
The following exception occurred in the DataGridView


System.FormatException: String was not recognized as a valid DateTime.

at System.DateTimeParse.Parse(String s, DateTimeFormat dtfi,DateTimeStyles styles)

at System.DateTime.Parse(String s, IFormatProvider provider)
如何处理此异常以从datagridview接受日期字符串为“dd/MM/yyyy”


提前谢谢。

我的建议是,您必须手动检查每个单元格的格式。使用
CellValueChanged
事件

在你的主课上:

String msg="";
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    string value = dataGridView1.CurrentCell.Value.ToString();
    dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells["DATE"].Value = trapInputs(value);
    MessageBox.Show(msg);
}

public string trapInputs(string value)
{
    DateTime val = DateTime.Now;
            try
            {
                val = Convert.ToDateTime(value);
            }
            catch
            {
                if (value.Split('/').Length == 3)
                {
                    string[] arr = value.Split('/');
                    try
                    {
                        if (Convert.ToInt32(arr[1]) > Convert.ToInt32(arr[0]))
                        {
                            val = Convert.ToDateTime(arr[1] + "/" + arr[0] + "/" + arr[2]);
                        }
                    }
                    catch
                    {
                        msg = "Invalid date.";
                    }
                }
                else if(value.Split('-').Length==3)
                {
                    string[] arr = value.Split('-');
                    try
                    {
                        if (Convert.ToInt32(arr[1]) > Convert.ToInt32(arr[0]))
                        {
                            val = Convert.ToDateTime(arr[1] + "-" + arr[0] + "-" + arr[2]);
                        }
                    }
                    catch
                    {
                        msg = "Invalid date.";
                    }
                }
                else
                {
                    msg = "Invalid date.";
                }
            }
            value = String.Format("{0:yyyy-MM-dd}", val);
}

在date列中,在datagridview中添加datetimepicker控件,并根据需要更改格式。在这里,我选择将日期格式化为dd/MM/yyyy

//Declare this variable     
    DateTimePicker dtp = new DateTimePicker();  //DateTimePicker  
    Rectangle _Rectangle;  

    public Form1()
    {
        InitializeComponent();

        dtp.Visible = false;  //  
        dtp.Format = DateTimePickerFormat.Custom;  
    }

    private void dtp_TextChange(object sender, EventArgs e)
    {
        dataGridView1.CurrentCell.Value = dtp.Value.ToString();  //
    }

    private void dtp_CloseUp(object sender, EventArgs e)
    {
        dtp.Visible = false;
    }


    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            connection.ConnectionString = "datasource=localhost;port=3306;username=root;password=root";
            string sql = "SELECT * FROM database.table";
            dataAdapter = new MySqlDataAdapter(sql, connection);
            dataTable = new DataTable();
            connection.Open();
            dataAdapter.Fill(dataTable);
            connection.Close();

            dataGridView1.DataSource = dataTable;
            dataGridView1.Columns["DATE"].DefaultCellStyle.Format = "dd/MM/yyyy";
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
            if (e.ColumnIndex == 2)  // here 2 is the date column in datagridview1
            {
                dataGridView1.Controls.Add(dtp);  
                dtp.Value =Convert.ToDateTime(dataGridView1.CurrentCell.Value.ToString());
                dtp.CustomFormat = "dd/MM/yyyy";    // change the custom format here to display on the datetimepicker
                dtp.TextChanged += new EventHandler(dtp_TextChange); //dtp_TextChange
                dtp.Visible = true;  //  


                _Rectangle = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); //  
                dtp.Size = new Size(_Rectangle.Width, _Rectangle.Height); //  
                dtp.Location = new Point(_Rectangle.X, _Rectangle.Y); //  

                dtp.CloseUp+=new EventHandler(dtp_CloseUp);

            }
            else
                dtp.Visible = false;  
    }

    private void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
    {
        dtp.Visible = false;  
    }

    private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
    {
        dtp.Visible = false;  
    }

这对我来说非常合适。如果您有任何错误,请告诉我。

有人能回答我吗。Pleasecell value changed事件不起作用,因为在将日期输入为dd/MM/yyyy并按enter键后,它在datagridview中显示相同的异常。更改回MM/dd/yyyy并按enter键后,cellvaluechanged事件将触发并挂起。请帮助我…您的
日期
列的列类型是什么?如果是
typeof(DateTime)
将其更改为
typeof(string)
。我真的无法更改。有很多datetime列,它是动态的。我正在从datatable将其绑定到datagridview。是否可以使用相同的日期时间类型。当我得到异常错误时,它告诉我在dataerror事件中处理这个错误。