私は、datagridviewに2つの列、ClockIn
とClockOut
を持っています。これらは、カスタム形式:dd/MM/yyyy hh:mm:ss tt
の日時列です。私はセルの時間部分を更新したいが、更新をクリックすると、日付も現在の日付に変わる。どのように日付をそのまま維持し、時間だけを変更するのですか?ここでDataGridViewのカスタム(dd/MM/yyyy hh:mm:ss tt)DateTimeセルの時刻部分を更新するにはどうすればよいですか?
は、私が何を言っているかのプレビューです:
ここで私は時間にタイムスパンを計算するために使用していたコードです。
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;
}
}
}
}
私は間違っていますか?
どこから来ることができますグリッドを移入するデータがありますか?バインドされたコレクションを持つビューモデルですか?あなたは手動でデータグリッドの値を変更していますか? –
値はデータベースから来て、私はdatagridview内のセルを編集して値を変更しています。 – Finweb
これが問題です。 。 。値をデータグリッドに正しくバインドし、グリッド内のdatetime列に接続されたdatetimeピッカーを使用して、値の直接操作を防止する必要があります。 –