2017-11-27 17 views
0

私は、datagridviewに2つの列、ClockInClockOutを持っています。これらは、カスタム形式:dd/MM/yyyy hh:mm:ss ttの日時列です。私はセルの時間部分を更新したいが、更新をクリックすると、日付も現在の日付に変わる。どのように日付をそのまま維持し、時間だけを変更するのですか?ここでDataGridViewのカスタム(dd/MM/yyyy hh:mm:ss tt)DateTimeセルの時刻部分を更新するにはどうすればよいですか?

は、私が何を言っているかのプレビューです:

enter image description here

ここで私は時間にタイムスパンを計算するために使用していたコードです。

private void dgv_EmpTimecard_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    if (dgv_EmpTimecard.Columns[e.ColumnIndex].Name == "clockInDataGridViewTextBoxColumn"||dgv_EmpTimecard.Columns[e.ColumnIndex].Name == "clockOutDataGridViewTextBoxColumn") 
    {    
     TimeSpan workedhours = (Convert.ToDateTime(dgv_EmpTimecard["clockOutDataGridViewTextBoxColumn", e.RowIndex].Value)) - (Convert.ToDateTime(dgv_EmpTimecard["clockInDataGridViewTextBoxColumn", e.RowIndex].Value)); 
     decimal actworkedhours = Convert.ToDecimal(workedhours.TotalHours) - 1; 

     dgv_EmpTimecard["workedHoursDataGridViewTextBoxColumn", e.RowIndex].Value = Convert.ToDecimal(workedhours.TotalHours).ToString("0.000"); 
     dgv_EmpTimecard["actualWorkedHoursDataGridViewTextBoxColumn", e.RowIndex].Value = Convert.ToDecimal(actworkedhours).ToString("0.000"); 
    } 
} 

私はこのコードを使用して2つの列をフォーマットしています。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TARS01 
{ 
    public class TimeColumn : DataGridViewColumn 
    { 
     public TimeColumn() : base() 
     { 
      base.CellTemplate = new CalendarCell1(); 
     } 

     public override DataGridViewCell CellTemplate 
     { 
      get 
      { 
       return base.CellTemplate; 
      } 
      set 
      { 
       if (!((value == null)) && !(value.GetType().IsAssignableFrom(typeof(CalendarCell1)))) 
       { 
        throw new InvalidCastException("Must be a CalendarCell"); 
       } 
       base.CellTemplate = value; 
      } 
     } 
    } 
    public class CalendarCell1 : DataGridViewTextBoxCell 
    { 
     public CalendarCell1() 
     { 
      this.Style.Format = "dd/MM/yyyy hh:mm:ss tt"; 
     } 
     public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
     { 
      base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); 

      CalendarEditingControl1 ctl = (CalendarEditingControl1)DataGridView.EditingControl; 
      if (this.RowIndex >= 0) 
      { 
       if (!(object.ReferenceEquals(this.Value, DBNull.Value))) 
       { 
        if (this.Value != null) 
        { 
         if (this.Value.ToString() != "") 
         { 
          try 
          { 
           ctl.Value = DateTime.Parse(this.Value.ToString()); 
          } 
          catch (Exception ex) 
          { 
           MessageBox.Show(ex.Message); 
          } 
         } 
        } 
       } 
      } 
     } 
     public override System.Type EditType 
     { 
      get 
      { 
       return typeof(CalendarEditingControl1); 
      } 
     } 
     public override System.Type ValueType 
     { 
      get 
      { 
       return typeof(DateTime); 
      } 
     } 
     public override object DefaultNewRowValue 
     { 
      get 
      { 
       return DateTime.Now.ToShortTimeString(); 
       //return DateTime.Parse(this.Value.ToString()); 
      } 
     } 
    } 
    internal class CalendarEditingControl1 : DateTimePicker, IDataGridViewEditingControl 
    { 
     private DataGridView dataGridViewControl; 
     private bool valueIsChanged = false; 
     private int rowIndexNum; 

     public CalendarEditingControl1() 
     { 
      this.Format = DateTimePickerFormat.Custom; 
      CustomFormat = "dd/MM/yyyy hh:mm:ss tt"; 
     } 
     public object EditingControlFormattedValue 
     { 
      get 
      { 
       return this.Value.ToShortTimeString(); 
       //return this .Value.Hour.ToString(); 
      } 
      set 
      { 
       if (value is string) 
       { 
        this.Value = DateTime.Parse(System.Convert.ToString(value)); 
       } 
      } 
     } 
     public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) 
     { 
      return this.Value.ToShortTimeString(); 
     } 
     public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) 
     { 
      this.Font = dataGridViewCellStyle.Font; 
      this.ShowUpDown = true; 
      this.CalendarForeColor = dataGridViewCellStyle.ForeColor; 
      this.CalendarMonthBackground = dataGridViewCellStyle.BackColor; 
     } 

     public int EditingControlRowIndex 
     { 
      get 
      { 
       return rowIndexNum; 
      } 
      set 
      { 
       rowIndexNum = value; 
      } 
     } 

     public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey) 
     { 
      if (Keys.KeyCode == Keys.Left || Keys.KeyCode == Keys.Up || Keys.KeyCode == Keys.Down || Keys.KeyCode == Keys.Right || Keys.KeyCode == Keys.Home || Keys.KeyCode == Keys.End || Keys.KeyCode == Keys.PageDown || Keys.KeyCode == Keys.PageUp) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public void PrepareEditingControlForEdit(bool selectAll) 
     { 
     } 

     public bool RepositionEditingControlOnValueChange 
     { 
      get 
      { 
       return false; 
      } 
     } 

     public DataGridView EditingControlDataGridView 
     { 
      get 
      { 
       return dataGridViewControl; 
      } 
      set 
      { 
       dataGridViewControl = value; 
      } 
     } 

     public bool EditingControlValueChanged 
     { 
      get 
      { 
       return valueIsChanged; 
      } 
      set 
      { 
       valueIsChanged = value; 
      } 
     } 

     public Cursor EditingControlCursor 
     { 
      get 
      { 
       return base.Cursor; 
      } 
     } 

     protected override void OnValueChanged(System.EventArgs eventargs) 
     { 
      valueIsChanged = true; 
      this.EditingControlDataGridView.NotifyCurrentCellDirty(true); 
      base.OnValueChanged(eventargs); 
     } 
     Cursor IDataGridViewEditingControl.EditingPanelCursor 
     { 
      get 
      { 
       return this.IDataGridViewEditingControl_EditingPanelCursor; 
      } 
     } 
     private Cursor IDataGridViewEditingControl_EditingPanelCursor 
     { 
      get //throw new Exception("The method or operation is not implemented."); } 
      { 
       return base.Cursor; 
      } 
     } 
    } 
} 

私は間違っていますか?

+0

どこから来ることができますグリッドを移入するデータがありますか?バインドされたコレクションを持つビューモデルですか?あなたは手動でデータグリッドの値を変更していますか? –

+0

値はデータベースから来て、私はdatagridview内のセルを編集して値を変更しています。 – Finweb

+0

これが問題です。 。 。値をデータグリッドに正しくバインドし、グリッド内のdatetime列に接続されたdatetimeピッカーを使用して、値の直接操作を防止する必要があります。 –

答えて

0

DateTime.Add()メソッドを使用して、追加する必要がある時間を追加できます。この

DateTime currentDate = DateTime.Now; 
TimeSpan addingHours = new TimeSpan(8, 0, 0); 
dgvTimeAddedColumn[rowNo, columnNo].Value = currentDate.Add(addingHours).ToString(); 

ような何か希望これは

+0

私はそれを現在の日付に変更せずに既存の日付にどのように追加しますか? – Finweb

+0

既存の値があり、1時間しか追加しない場合は、追加された時間によって翌日に変更されない限り、日付は変更されません。 –

+0

@ PaulGibson上記のように時間を追加しようとしましたが、日付は現在の日付に変更されています。 – Finweb

関連する問題