我创建了一个usercontrol,你可以添加不同的时间段。所有时间段一起形成一次旅行。控件应绘制相对于控件宽度的所有时隙。颜色取决于ActivityType
。
如果我在Load方法中添加TripActivity
,则控件可以正常工作。
但是,如果我稍后添加TripActivity
, - 通过调用方法ActivityAdd
- 活动会添加到Activiteiten列表中,但没有任何更改:TripTimebar_Paint
未被调用。即使使用refresh()
或invalidate()
。
请帮忙
亲切的问候 维克多
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace VPBAdmin
{
public partial class TripTimeBar : UserControl
{
public class TripActivity
{
public string ActivityType { get; set; }
public int Status { get; set; } // 0 = not yet, 1 = busy, 2 = finished
public DateTime PlannedStart { get; set; }
public int PlannedDuration { get; set; }
public DateTime PlannedEnd { get; set; }
public DateTime RealStart { get; set; }
public int RealDuration { get; set; }
ublic DateTime RealEnd { get; set; }
public TripActivity(string p_sType, int p_iStatus, DateTime p_dtPlannedStart, int p_iPlannedDuration,
DateTime p_dtPlannedEnd, DateTime p_dtRealStart, int p_iRealDuration, DateTime p_dtRealEnd)
{
ActivityType = p_sType;
Status = p_iStatus;
PlannedStart = p_dtPlannedStart;
PlannedDuration = p_iPlannedDuration;
PlannedEnd = p_dtPlannedEnd;
RealStart = p_dtRealStart;
RealDuration = p_iRealDuration;
RealEnd = p_dtRealEnd;
}
}
public string Trip { get; set; }
private List<TripActivity> Activiteiten ;
public TripTimeBar()
{
InitializeComponent();
Activiteiten = new List<TripActivity>();
}
public void ActivityAdd(string p_sType, int p_iStatus, DateTime p_dtPlannedStart, int p_iPlannedDuration,
DateTime p_dtPlannedEnd, DateTime p_dtRealStart, int p_iRealDuration, DateTime p_dtRealEnd)
{
TripActivity ta = new TripActivity(p_sType, p_iStatus, p_dtPlannedStart, p_iPlannedDuration,
p_dtPlannedEnd, p_dtRealStart, p_iRealDuration, p_dtRealEnd);
Activiteiten.Add(ta);
Invalidate();
}
private void TripTimeBar_Load(object sender, EventArgs e)
{
Activiteiten.Add(new TripActivity("1", 0, DateTime.Now, 30, DateTime.Now, DateTime.Now, 0, DateTime.Now));
Activiteiten.Add(new TripActivity("2", 0, DateTime.Now, 10, DateTime.Now, DateTime.Now, 0, DateTime.Now));
Activiteiten.Add(new TripActivity("3", 0, DateTime.Now, 8, DateTime.Now, DateTime.Now, 0, DateTime.Now));
Activiteiten.Add(new TripActivity("2", 0, DateTime.Now, 26, DateTime.Now, DateTime.Now, 0, DateTime.Now));
Activiteiten.Add(new TripActivity("1", 0, DateTime.Now, 24, DateTime.Now, DateTime.Now, 0, DateTime.Now));
}
private void TripTimeBar_Paint(object sender, PaintEventArgs e)
{
if (Activiteiten.Count == 0) return;
if (Width < 1) return;
SolidBrush redBrush = new SolidBrush(Color.Red);
SolidBrush blueBrush = new SolidBrush(Color.SlateGray);
SolidBrush greenBrush = new SolidBrush(Color.Green);
SolidBrush currentBrush;
int l_iWidth = Width;
int l_iHeight = Height;
int l_iNrActivities = Activiteiten.Count;
int l_iTotalDuration = Activiteiten.Select(x => x.PlannedDuration).Sum();
int l_iXPlanned = 0, l_iXReal = 0;
// De hele breedte is gelijk aan het totaal aantal minuten.
double l_dDivFactor = (double)l_iWidth / (double)l_iTotalDuration;
foreach (TripActivity ta in Activiteiten)
{
int l_iActivityWidth = (int)(ta.PlannedDuration * l_dDivFactor);
switch (ta.ActivityType)
{
case "1":
currentBrush = redBrush;
break;
case "2":
currentBrush = blueBrush;
break;
case "3":
currentBrush = greenBrush;
break;
default:
currentBrush = redBrush;
break;
}
e.Graphics.FillRectangle(currentBrush, new Rectangle(l_iXPlanned, 0, l_iActivityWidth, l_iHeight));
l_iXPlanned += l_iActivityWidth;
}
}
}
}