| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| DataGridView (原生) | 無第三方依賴;數據綁定成熟;單元格編輯內建 | 時間軸視覺化弱;拖動調整需大量自繪代碼;大數據渲染慢 | 簡單表格式考勤表,無複雜交互 |
| FlexChart / C1FlexGrid (ComponentOne) | 專業時間軸、甘特圖控件;拖拽調整內建;樣式豐富 | 商業收費較貴;部署需授權 | 企業級考勤/排班系統,預算充足 |
| DevExpress GridControl + Scheduler | 功能極強,甘特圖、時間線、拖拽、打印導出完美 | 學習曲線陡峭;體積大;商業授權 | 複雜排班、資源調度、項目管理 |
| LiveCharts2 / ScottPlot / OxyPlot (開源圖表庫) | 免費、靈活、支持自定義幾何圖形 | 無現成「考勤條」控件,需自繪矩形+拖拽邏輯 | 有開發能力、追求輕量、跨平台 |
自繪 (Panel + OnPaint + 鼠標事件) |
完全可控、零依賴、性能最高 | 開發成本高:佈局、命中測試、拖拽、滾動、縮放全手寫 | 極簡需求、嵌入式/無 WinForms 環境 |
// 1. 定義數據模型
class AttendanceRow {
public string Employee { get; set; }
public DateTime Date { get; set; }
public TimeSpan WorkStart { get; set; }
public TimeSpan WorkEnd { get; set; }
public TimeSpan OvertimeStart { get; set; }
public TimeSpan OvertimeEnd { get; set; }
// 計算屬性供顯示
public string WorkPeriod => $"{WorkStart:hh\\:mm}-{WorkEnd:hh\\:mm}";
public string OvertimePeriod => OvertimeStart == TimeSpan.Zero ? "" : $"{OvertimeStart:hh\\:mm}-{OvertimeEnd:hh\\:mm}";
}
// 2. 綁定 DataGridView
dgv.DataSource = attendanceList;
// 3. 自定義繪製「時間條」列 (繼承 DataGridViewColumn/Cell)
public class TimeBarColumn : DataGridViewColumn {
public TimeBarColumn() { CellTemplate = new TimeBarCell(); }
}
public class TimeBarCell : DataGridViewTextBoxCell {
protected override void Paint(Graphics g, Rectangle clip, Rectangle bounds, int rowIndex,
DataGridViewElementStates state, object value, object formattedValue,
string errorText, DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts) {
// 1. 繪製背景網格 (小時刻度)
// 2. 根據 WorkStart/WorkEnd 繪製藍色矩形
// 3. 根據 OvertimeStart/End 繪製橙色矩形
// 4. 滑鼠懸停/拖拽邏輯在 DataGridView.MouseMove/MouseDown/Up 處理
}
}
MouseDown:命中測試 → 確定拖拽的是哪個矩形的哪個邊 (左/右)。MouseMove:計算鼠標 X 對應的時間值 → 更新數據模型 → InvalidateCell 重繪。MouseUp:確認修改,寫入數據庫。一套成熟的 Scheduler/Gantt 控件能節省 2-3 個人月開發量,包含:多資源視圖、衝突檢測、循環班次、打印報表、導出 Excel/PDF、觸屏適配。對於商業項目,**買比造划算**。