用户控件不刷新

时间:2017-11-05 13:56:41

标签: c# onpaint

我创建了一个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;
            }
        }
    }
}

0 个答案:

没有答案