ワークショップ内のすべての車のリストを表示するデータグリッドビューがあります。登録番号の右側には、いくつかのフェーズの列があります。各車の各フェーズの所要時間は推定されており、その横に実際にかかった時間を表示する必要があります。理想的には、これは時を刻むライブ タイマーである必要があります。
各ジョブの各フェーズは、アクティブ、一時停止、または完了できます。
データベーステーブルに関しては、次のものがあります-
仕事の詳細
ID - PK Auto increment
JobID - Int (Joined to Jobs table)
PhaseID - String (joined to JobPhases table)
EstimatedTime - decimal
ActualTime decimal
Status int (EntryType - NotStarted, Active, Paused, Complete)
ジョブフェーズ
ID - PK String
Name - VarChar(150)
タイムログ
ID int
JobID int
PhaseID string
UserID int
DateEntry datetime
EntryType int
ユーザー ID、ジョブ番号、タスク ID、アクション (NotStarted、Active、Pauused、Complete) がバーコードを介してスキャンされます。これにより、ジョブがアクティブに設定されます。
JobDetail.ActualTime を TimeLog.LastEntry.DateEntry に追加することで、所要時間を設定および取得できます。問題は、これを各セルのライブ ティッカーとして表示するか、少なくとも約 10 秒間隔で更新する必要があることです。
私がこれまでに持っているコードは -
private void tstbCommand_Leave(object sender, EventArgs e)
{
User u = User.FromID(Convert.ToInt32(tstbUser.Text.TrimStart('U')));
Job j = Job.FromID(Convert.ToInt32(tstbJobNo.Text.TrimStart('E', 'N', 'K', 'J', 'C')));
JobDetail jd = JobDetail.JobDetailFromJobIDAndPhaseID(j.ID, tstbTaskID.Text.TrimStart('E', 'N', 'K', 'J', 'C', 'D'));
TimeLog log = new TimeLog();
switch (tstbCommand.Text)
{
case "CMDACTIVE":
if (jd.Status == EntryType.Active)
{
//Alert already active
lstAlerts.Items.Add("The scanned job is already active.");
}
else
{
//Ok to update status to active
jd.Status = EntryType.Active;
log.EntryType = jd.Status;
JobPhaseTimer timer = new JobPhaseTimer();
timer.UID = jd.ID + "_" + jd.PhaseID;
timer.JobDetailID = jd.ID;
timer.JobID = j.ID;
timer.PhaseID = jd.PhaseID;
timer.StartTime = DateTime.Now;
timer.Stopwatch.Start();
timer.Start();
timers.Add(timer.UID, timer);
lstAlerts.Items.Add("The job " + jd.JobID + " has been set to active by " + u.FullName + ".");
}
break;
case "CMDPAUSE":
if (jd.Status == EntryType.Paused)
{
lstAlerts.Items.Add("The scanned job is already paused.");
}
else
{
JobPhase phase = JobPhase.FromID(jd.PhaseID);
jd.Status = EntryType.Paused;
log.EntryType = jd.Status;
TimeLog lastEntry = TimeLog.GetLastTimeLogEntry(j.ID, jd.PhaseID);
lstAlerts.Items.Add(lastEntry.EntryType + ", " + lastEntry.DateEntry);
jd.ActualTime = Convert.ToDecimal(jd.ActualTime) + Convert.ToDecimal(DateTime.Now.Subtract(lastEntry.DateEntry).TotalHours);
lstAlerts.Items.Add("The job phase " + phase.Name + " for job " + jd.JobID + " has been paused by " + u.FullName + ".");
}
break;
case "CMDCOMPLETE":
if (jd.Status == EntryType.Complete)
{
lstAlerts.Items.Add("The scanned job is already completed.");
}
else
{
jd.Status = EntryType.Complete;
log.EntryType = jd.Status;
lstAlerts.Items.Add("The job " + jd.JobID + " has been completed by " + u.FullName + ".");
}
break;
case "CMDQC":
if (u.MergedRole.HasRight("workshop.QualityCheck"))
{
if (jd.Status == EntryType.QualityChecked)
{
lstAlerts.Items.Add("The scanned job has already been quality checked.");
}
else
{
jd.Status = EntryType.QualityChecked;
log.EntryType = jd.Status;
lstAlerts.Items.Add("The job " + jd.JobID + " has been quality checked by " + u.FullName + ".");
}
}
else
{
lstAlerts.Items.Add("You do not have sufficient rights to quality check.");
}
break;
}
log.JobID = j.ID;
log.UserID = u.ID;
log.PhaseID = jd.PhaseID;
log.EntryType = jd.Status;
jd.UpdateJobDetail(u.Username);
log.AddNewTimeLog();
tstbJobNo.Text = "";
tstbUser.Text = "";
tstbTaskID.Text = "";
tstbCommand.Text = "";
}
データグリッドビューにデータを保持するために、現時点ではタイマーティックで LoadData() を呼び出しています-
void LoadData()
{
foreach (JobPhaseTimer timer in timers.Values)
{
JobDetail jd = JobDetail.JobDetailFromJobIDAndPhaseID(timer.JobID, timer.PhaseID);
jd.ActualTime = jd.ActualTime + Convert.ToDecimal(timer.Stopwatch.ElapsedMilliseconds);
jd.UpdateJobDetail("Test");
}
dt = JobManager.GetTodaysJobs();
if (dataGridView1.InvokeRequired)
dataGridView1.Invoke(new MethodInvoker(delegate
{
//access picturebox here#
dt = JobManager.GetTodaysJobs();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dt;
dataGridView1.AutoResizeColumns();
}));
else
{
//access picturebox here
dt = JobManager.GetTodaysJobs();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dt;
dataGridView1.AutoResizeColumns();
}
}
最後に、EstimatedTime/ActualTime に従ってセルの色をフォーマットする必要があります。ActualTime (Live) が EstiamtedTime を下回っている場合 - 緑。ActualTime が EstiamtedTime - Red より大きい場合、Actualime が近い場合 (ロジックはまだ決定されていません)、黄色を表示します。
上記をどのように達成できるかについての考え/アイデアはありますか? 以前にライブデータグリッドを行ったことがありません!