2015-03-05 7 views
0

В datagridview я показываю несколько полей из базы данных MySql.Как обновить столбец даты как пользовательский формат в datagridview? - C#

Одно из полей типа DATE. Я отображая столбец DATE как пользовательский формат т.е. дд/мм/гггг в DataGridView

 dataGridView1.Columns["DATE"].DefaultCellStyle.Format = "dd/MM/yyyy"; 

Здесь я использую CommandBuilder обновить базу данных из DataGridView.

Когда я хочу отредактировать столбец даты, я ввожу дату в формате MM/dd/yyyy. Оно работает.

Но мне нужно обновить столбец даты в формате dd/MM/yyyy из datagridview. Если бы я сделать это, я получаю следующее исключение из DataGridView

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?

Заранее спасибо.

+0

Может кто-нибудь ответить мне. Пожалуйста, –

ответ

0

Мое предложение было бы, вы должны вручную проверить формат каждой ячейки. Используйте событие 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); 
} 
+0

Это не работает. :( –

+0

Событие с измененной стоимостью ячейки не работает, поскольку после ввода даты как dd/MM/yyyy и нажатия ввода, оно отображает одно и то же исключение из datagridview. После смены на MM/dd/yyyy и нажатия клавиши enter, зависает. Пожалуйста, помогите мне ... –

+0

Каков тип столбца вашего столбца 'DATE'? Если это' typeof (DateTime) 'изменить его на' typeof (string) '. – ThEpRoGrAmMiNgNoOb

1

В столбце даты, добавить элемент управления DateTimePicker в DataGridView и изменить формат, как вы хотите. Здесь я предпочитаю форматировать дату как 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; 
    } 

Это прекрасно работает для меня. Если вы получите какую-либо ошибку, сообщите мне.

Смежные вопросы