首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 考勤圖表控件選型:DataGridView vs 專用圖表庫 vs 自繪

     編輯:程式設計綜合問答

需求拆解

  • 按時間軸顯示考勤記錄(上班/下班/加班/請假)。
  • 支持鼠標拖動調整時間區間(如拖動延長加班時間)。
  • 數據綁定、樣式自定義、性能穩定。

方案對比

方案優點缺點適用場景
DataGridView (原生) 無第三方依賴;數據綁定成熟;單元格編輯內建 時間軸視覺化弱;拖動調整需大量自繪代碼;大數據渲染慢 簡單表格式考勤表,無複雜交互
FlexChart / C1FlexGrid (ComponentOne) 專業時間軸、甘特圖控件;拖拽調整內建;樣式豐富 商業收費較貴;部署需授權 企業級考勤/排班系統,預算充足
DevExpress GridControl + Scheduler 功能極強,甘特圖、時間線、拖拽、打印導出完美 學習曲線陡峭;體積大;商業授權 複雜排班、資源調度、項目管理
LiveCharts2 / ScottPlot / OxyPlot (開源圖表庫) 免費、靈活、支持自定義幾何圖形 無現成「考勤條」控件,需自繪矩形+拖拽邏輯 有開發能力、追求輕量、跨平台
自繪 (Panel + OnPaint + 鼠標事件) 完全可控、零依賴、性能最高 開發成本高:佈局、命中測試、拖拽、滾動、縮放全手寫 極簡需求、嵌入式/無 WinForms 環境

推薦:DataGridView + 自定義列 (低成本快速實現)

// 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 處理
    }
}

拖拽調整時間核心邏輯

  1. MouseDown:命中測試 → 確定拖拽的是哪個矩形的哪個邊 (左/右)。
  2. MouseMove:計算鼠標 X 對應的時間值 → 更新數據模型 → InvalidateCell 重繪。
  3. MouseUp:確認修改,寫入數據庫。

若預算允許:直接購買 DevExpress / ComponentOne

一套成熟的 Scheduler/Gantt 控件能節省 2-3 個人月開發量,包含:多資源視圖、衝突檢測、循環班次、打印報表、導出 Excel/PDF、觸屏適配。對於商業項目,**買比造划算**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved