Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/03/09 14:35:19 (15 years ago)
Author:
whackl
Message:

added recurring appoinment (#468)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Hive.Client.Console/HiveClientConsole.cs

    r1333 r1511  
    2222using System;
    2323using System.Collections.Generic;
    24 using System.ComponentModel;
    25 using System.Data;
     24using System.Diagnostics;
    2625using System.Drawing;
    2726using System.Linq;
    28 using System.Text;
     27using System.Net;
     28using System.ServiceModel;
    2929using System.Windows.Forms;
    30 using System.Diagnostics;
    31 using System.Threading;
     30using Calendar;
     31using HeuristicLab.Hive.Client.Console.ClientService;
    3232using ZedGraph;
    33 using HeuristicLab.Hive.Client.Console.ClientService;
    34 using System.ServiceModel;
    35 using System.Net;
    36 using Calendar;
    37 using System.Globalization;
    38 
    39 namespace HeuristicLab.Hive.Client.Console {
     33
     34namespace HeuristicLab.Hive.Client.Console
     35{
    4036
    4137  #region Delegates
    4238
    43   delegate void UpdateTextDelegate(EventLogEntry ev);
     39  public delegate void UpdateTextDelegate(EventLogEntry ev);
     40  public delegate void OnDialogClosedDelegate(RecurrentEvent e);
    4441
    4542  #endregion
    4643
    47   public partial class HiveClientConsole : Form {
     44  public partial class HiveClientConsole : Form
     45  {
    4846
    4947    #region Declarations
     
    5957    private List<Appointment> onlineTimes = new List<Appointment>();
    6058
     59    public OnDialogClosedDelegate dialogClosedDelegate;
     60
    6161    #endregion
    6262
    6363    #region Constructor
    6464
    65     public HiveClientConsole() {
     65    public HiveClientConsole()
     66    {
    6667      InitializeComponent();
    6768      lvwColumnSorter = new ListViewColumnSorterDate();
     
    8081    #region Methods
    8182
    82     private void InitTimer() {
     83    private void InitTimer()
     84    {
    8385      refreshTimer = new System.Windows.Forms.Timer();
    8486      refreshTimer.Interval = 1000;
     
    8789    }
    8890
    89     private void RefreshGui() {
    90       try {
     91    private void RefreshGui()
     92    {
     93      try
     94      {
    9195        cccc.GetStatusInfosAsync();
    9296      }
    93       catch (Exception ex) {
     97      catch (Exception ex)
     98      {
    9499        refreshTimer.Stop();
    95100        DialogResult res = MessageBox.Show("Connection Error, check if Hive Client is running!", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
    99104    }
    100105
    101     private void ConnectToClient() {
    102       try {
     106    private void ConnectToClient()
     107    {
     108      try
     109      {
    103110        cccc = new ClientConsoleCommunicatorClient(new NetTcpBinding(), new EndpointAddress(ENDPOINTADRESS));
    104111        cccc.GetStatusInfosCompleted += new EventHandler<GetStatusInfosCompletedEventArgs>(cccc_GetStatusInfosCompleted);
    105112        cccc.GetCurrentConnectionCompleted += new EventHandler<GetCurrentConnectionCompletedEventArgs>(cccc_GetCurrentConnectionCompleted);
    106113      }
    107       catch (Exception) {
     114      catch (Exception)
     115      {
    108116        refreshTimer.Stop();
    109117        DialogResult res = MessageBox.Show("Connection Error, check if Hive Client is running!", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
    113121    }
    114122
    115     private void GetEventLog() {
     123    private void GetEventLog()
     124    {
    116125      HiveClientEventLog = new EventLog(EVENTLOGNAME);
    117126      HiveClientEventLog.Source = EVENTLOGNAME;
     
    122131
    123132      //databinding on listview?
    124       if (HiveClientEventLog != null && HiveClientEventLog.Entries != null) {
    125         foreach (EventLogEntry ele in HiveClientEventLog.Entries) {
     133      if (HiveClientEventLog != null && HiveClientEventLog.Entries != null)
     134      {
     135        foreach (EventLogEntry ele in HiveClientEventLog.Entries)
     136        {
    126137          curEventLogEntry = GenerateEventEntry(ele);
    127138          lvLog.Items.Add(curEventLogEntry);
     
    131142    }
    132143
    133     private ListViewItem GenerateEventEntry(EventLogEntry ele) {
     144    private ListViewItem GenerateEventEntry(EventLogEntry ele)
     145    {
    134146      ListViewItem curEventLogEntry;
    135147      curEventLogEntry = new ListViewItem("", 0);
     
    142154    }
    143155
    144     private void UpdateGraph(JobStatus[] jobs) {
     156    private void UpdateGraph(JobStatus[] jobs)
     157    {
    145158      ZedGraphControl zgc = new ZedGraphControl();
    146159      GraphPane myPane = zgc.GraphPane;
     
    162175      double done = 0;
    163176
    164       if (jobs.Length == 0) {
     177      if (jobs.Length == 0)
     178      {
    165179        myPane.AddPieSlice(100, Color.Green, 0.1, "");
    166       } else {
    167         for (int i = 0; i < jobs.Length; i++) {
     180      }
     181      else
     182      {
     183        for (int i = 0; i < jobs.Length; i++)
     184        {
    168185          allProgress += jobs[i].Progress;
    169186        }
     
    182199    }
    183200
    184     private void InitCalender() {
     201    private void InitCalender()
     202    {
    185203      dvOnline.StartDate = DateTime.Now;
    186204      dvOnline.OnNewAppointment += new EventHandler<NewAppointmentEventArgs>(DvOnline_OnNewAppointment);
     
    188206    }
    189207
    190     private Appointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay) {
     208    private Appointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay)
     209    {
    191210      Appointment App = new Appointment();
    192211      App.StartDate = startDate;
     
    196215      App.Locked = true;
    197216      App.Subject = "Online";
     217      App.Recurring = false;
    198218      return App;
    199219    }
    200220
    201     //private ConvertToAppointments(List<
     221    private Appointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay, bool recurring, Guid recurringId)
     222    {
     223      Appointment App = new Appointment();
     224      App.StartDate = startDate;
     225      App.EndDate = endDate;
     226      App.AllDayEvent = allDay;
     227      App.BorderColor = Color.Red;
     228      App.Locked = true;
     229      App.Subject = "Online";
     230      App.Recurring = recurring;
     231      App.RecurringId = recurringId;
     232      return App;
     233    }
     234
     235    private void DeleteAppointment()
     236    {
     237      onlineTimes.Remove(dvOnline.SelectedAppointment);
     238    }
     239
     240    private void DeleteRecurringAppointment(Guid recurringId)
     241    {
     242      onlineTimes.RemoveAll(a => a.RecurringId.ToString() == dvOnline.SelectedAppointment.RecurringId.ToString());
     243    }
    202244
    203245    #endregion
     
    205247    #region Events
    206248
    207     private void refreshTimer_Tick(object sender, EventArgs e) {
     249    private void refreshTimer_Tick(object sender, EventArgs e)
     250    {
    208251      RefreshGui();
    209252    }
    210253
    211     private void cccc_GetCurrentConnectionCompleted(object sender, GetCurrentConnectionCompletedEventArgs e) {
    212       if (e.Error == null) {
     254    private void cccc_GetCurrentConnectionCompleted(object sender, GetCurrentConnectionCompletedEventArgs e)
     255    {
     256      if (e.Error == null)
     257      {
    213258        ConnectionContainer curConnection = e.Result;
    214259        tbIPAdress.Text = curConnection.IPAdress;
    215260        tbPort.Text = curConnection.Port.ToString();
    216       } else {
     261      }
     262      else
     263      {
    217264        refreshTimer.Stop();
    218265        DialogResult res = MessageBox.Show("Connection Error, check if Hive Client is running! - " + e.Error.Message, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
    222269    }
    223270
    224     private void cccc_GetStatusInfosCompleted(object sender, GetStatusInfosCompletedEventArgs e) {
    225 
    226       if (e.Error == null) {
     271    private void cccc_GetStatusInfosCompleted(object sender, GetStatusInfosCompletedEventArgs e)
     272    {
     273
     274      if (e.Error == null)
     275      {
    227276        StatusCommons sc = e.Result;
    228277
     
    237286        ListViewItem curJobStatusItem;
    238287
    239         if (sc.Jobs != null) {
     288        if (sc.Jobs != null)
     289        {
    240290          lvJobDetail.Items.Clear();
    241291          double progress;
    242           foreach (JobStatus curJob in sc.Jobs) {
     292          foreach (JobStatus curJob in sc.Jobs)
     293          {
    243294            curJobStatusItem = new ListViewItem(curJob.JobId.ToString());
    244295            curJobStatusItem.SubItems.Add(curJob.Since.ToString());
     
    252303        UpdateGraph(sc.Jobs);
    253304
    254         if (sc.Status == NetworkEnumWcfConnState.Connected || sc.Status == NetworkEnumWcfConnState.Loggedin) {
     305        if (sc.Status == NetworkEnumWcfConnState.Connected || sc.Status == NetworkEnumWcfConnState.Loggedin)
     306        {
    255307          btConnect.Enabled = false;
    256308          btnDisconnect.Enabled = true;
    257309          lbCs.Text = sc.ConnectedSince.ToString();
    258310          cccc.GetCurrentConnectionAsync();
    259         } else if (sc.Status == NetworkEnumWcfConnState.Disconnected) {
     311        }
     312        else if (sc.Status == NetworkEnumWcfConnState.Disconnected)
     313        {
    260314          btConnect.Enabled = true;
    261315          btnDisconnect.Enabled = false;
    262316          lbCs.Text = String.Empty;
    263         } else if (sc.Status == NetworkEnumWcfConnState.Failed) {
     317        }
     318        else if (sc.Status == NetworkEnumWcfConnState.Failed)
     319        {
    264320          btConnect.Enabled = true;
    265321          btnDisconnect.Enabled = false;
     
    268324
    269325        cccc.GetCurrentConnection();
    270       } else {
     326      }
     327      else
     328      {
    271329        refreshTimer.Stop();
    272330        DialogResult res = MessageBox.Show("Connection Error, check if Hive Client is running! - " + e.Error.Message, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
    276334    }
    277335
    278     private void HiveClientConsole_Load(object sender, EventArgs e) {
     336    private void HiveClientConsole_Load(object sender, EventArgs e)
     337    {
    279338      //nothing to do
    280339    }
    281340
    282     private void UpdateText(EventLogEntry ev) {
    283       if (this.lvLog.InvokeRequired) {
     341    private void UpdateText(EventLogEntry ev)
     342    {
     343      if (this.lvLog.InvokeRequired)
     344      {
    284345        this.lvLog.Invoke(new
    285346          UpdateTextDelegate(UpdateText), new object[] { ev });
    286       } else {
     347      }
     348      else
     349      {
    287350        ListViewItem curEventLogEntry = GenerateEventEntry(ev);
    288351        lvLog.Items.Add(curEventLogEntry);
     
    291354    }
    292355
    293     public void OnEntryWritten(object source, EntryWrittenEventArgs e) {
     356    public void OnEntryWritten(object source, EntryWrittenEventArgs e)
     357    {
    294358      UpdateText(e.Entry);
    295359    }
    296360
    297     private void lvLog_DoubleClick(object sender, EventArgs e) {
     361    private void lvLog_DoubleClick(object sender, EventArgs e)
     362    {
    298363      ListViewItem lvi = lvLog.SelectedItems[0];
    299364      HiveEventEntry hee = new HiveEventEntry(lvi.SubItems[2].Text, lvi.SubItems[3].Text, lvi.SubItems[1].Text);
     
    303368    }
    304369
    305     private void btConnect_Click(object sender, EventArgs e) {
     370    private void btConnect_Click(object sender, EventArgs e)
     371    {
    306372      IPAddress ipAdress;
    307373      int port;
    308374      ConnectionContainer cc = new ConnectionContainer();
    309       if (IPAddress.TryParse(tbIPAdress.Text, out ipAdress) && int.TryParse(tbPort.Text, out port)) {
     375      if (IPAddress.TryParse(tbIPAdress.Text, out ipAdress) && int.TryParse(tbPort.Text, out port))
     376      {
    310377        cc.IPAdress = tbIPAdress.Text;
    311378        cc.Port = port;
    312379        cccc.SetConnectionAsync(cc);
    313       } else {
     380      }
     381      else
     382      {
    314383        MessageBox.Show("IP Adress and/or Port Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    315384      }
    316385    }
    317386
    318     private void btnDisconnect_Click(object sender, EventArgs e) {
     387    private void btnDisconnect_Click(object sender, EventArgs e)
     388    {
    319389      cccc.DisconnectAsync();
    320390    }
    321391
    322     private void lvLog_ColumnClick(object sender, ColumnClickEventArgs e) {
     392    private void lvLog_ColumnClick(object sender, ColumnClickEventArgs e)
     393    {
    323394      // Determine if clicked column is already the column that is being sorted.
    324       if (e.Column == lvwColumnSorter.SortColumn) {
     395      if (e.Column == lvwColumnSorter.SortColumn)
     396      {
    325397        // Reverse the current sort direction for this column.
    326         if (lvwColumnSorter.Order == SortOrder.Ascending) {
     398        if (lvwColumnSorter.Order == SortOrder.Ascending)
     399        {
    327400          lvwColumnSorter.Order = SortOrder.Descending;
    328         } else {
     401        }
     402        else
     403        {
    329404          lvwColumnSorter.Order = SortOrder.Ascending;
    330405        }
    331       } else {
     406      }
     407      else
     408      {
    332409        // Set the column number that is to be sorted; default to ascending.
    333410        lvwColumnSorter.SortColumn = e.Column;
     
    339416    }
    340417
    341     private void btn_clientShutdown_Click(object sender, EventArgs e) {
     418    private void btn_clientShutdown_Click(object sender, EventArgs e)
     419    {
    342420      DialogResult res = MessageBox.Show("Do you really want to shutdown the Hive Client?", "Hive Client Console", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    343       if (res == DialogResult.Yes) {
     421      if (res == DialogResult.Yes)
     422      {
    344423        cccc.ShutdownClient();
    345424        this.Close();
     
    347426    }
    348427
    349     private void btbDelete_Click(object sender, EventArgs e) {
     428    private void btbDelete_Click(object sender, EventArgs e)
     429    {
     430      Appointment selectedAppointment = dvOnline.SelectedAppointment;
    350431      if (dvOnline.SelectedAppointment != null)
    351         onlineTimes.Remove(dvOnline.SelectedAppointment);
     432      {
     433        if (!selectedAppointment.Recurring)
     434          DeleteAppointment();
     435        else
     436        {
     437          DialogResult res = MessageBox.Show("Delete all events in this series?", "Delete recurrences", MessageBoxButtons.YesNo);
     438          if (res != DialogResult.Yes)
     439            DeleteAppointment();
     440          else
     441            DeleteRecurringAppointment(selectedAppointment.RecurringId);
     442        }
     443      }
    352444      dvOnline.Invalidate();
    353445    }
    354446
    355     private void chbade_CheckedChanged(object sender, EventArgs e) {
    356       //if (chbade.Checked) {
    357       //  txttimeFrom.Visible = false;
    358       //  txttimeTo.Visible = false;
    359       //} else {
    360       //  txttimeFrom.Visible = true;
    361       //  txttimeTo.Visible = true;
    362       //}
     447    private void chbade_CheckedChanged(object sender, EventArgs e)
     448    {
    363449      txttimeFrom.Visible = !chbade.Checked;
    364450      txttimeTo.Visible = !chbade.Checked;
    365451    }
    366452
    367     private void dvOnline_OnSelectionChanged(object sender, EventArgs e) {
    368       if (dvOnline.Selection == SelectionType.DateRange) {
     453    private void dvOnline_OnSelectionChanged(object sender, EventArgs e)
     454    {
     455      if (dvOnline.Selection == SelectionType.DateRange)
     456      {
    369457        dtpFrom.Text = dvOnline.SelectionStart.ToShortDateString();
    370458        dtpTo.Text = dvOnline.SelectionEnd.Date.ToShortDateString();
    371459        txttimeFrom.Text = dvOnline.SelectionStart.ToShortTimeString();
    372460        txttimeTo.Text = dvOnline.SelectionEnd.ToShortTimeString();
    373       }
    374     }
    375 
    376     private void Connection_KeyPress(object sender, KeyPressEventArgs e) {
     461
     462        btCreate.Text = "Save";
     463      }
     464
     465      if (dvOnline.Selection == SelectionType.Appointment)
     466      {
     467
     468        dtpFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortDateString();
     469        dtpTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortDateString();
     470        txttimeFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortTimeString();
     471        txttimeTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortTimeString();
     472
     473        //also change the caption of the save button
     474        btCreate.Text = "Save changes";
     475      }
     476
     477      if (dvOnline.Selection == SelectionType.None)
     478      {
     479        //also change the caption of the save button
     480        btCreate.Text = "Save";
     481      }
     482
     483    }
     484
     485    private void Connection_KeyPress(object sender, KeyPressEventArgs e)
     486    {
    377487      if (e.KeyChar == (char)Keys.Return)
    378488        btConnect_Click(null, null);
    379489    }
    380490
    381     private void mcOnline_DateChanged(object sender, DateRangeEventArgs e) {
     491    private void mcOnline_DateChanged(object sender, DateRangeEventArgs e)
     492    {
    382493      dvOnline.StartDate = mcOnline.SelectionStart;
    383494    }
    384495
    385     private void btCreate_Click(object sender, EventArgs e) {
     496    private bool CreateAppointment()
     497    {
    386498      DateTime from, to;
    387499
    388       if (!string.IsNullOrEmpty(dtpFrom.Text) && !string.IsNullOrEmpty(dtpTo.Text)) {
    389         if (chbade.Checked) {
     500      if (!string.IsNullOrEmpty(dtpFrom.Text) && !string.IsNullOrEmpty(dtpTo.Text))
     501      {
     502        if (chbade.Checked)
     503        {
    390504          //whole day appointment, only dates are visible
    391505          if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to)
     
    393507          else
    394508            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    395         } else if (!string.IsNullOrEmpty(txttimeFrom.Text) && !string.IsNullOrEmpty(txttimeTo.Text)) {
     509        }
     510        else if (!string.IsNullOrEmpty(txttimeFrom.Text) && !string.IsNullOrEmpty(txttimeTo.Text))
     511        {
    396512          //Timeframe appointment
    397           if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to) {
     513          if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to)
     514          {
    398515            if (from.Date == to.Date)
    399516              onlineTimes.Add(CreateAppointment(from, to, false));
    400             else {
     517            else
     518            {
    401519              //more than 1 day selected
    402               while (from.Date != to.Date) {
     520              while (from.Date != to.Date)
     521              {
    403522                onlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
    404523                from = from.AddDays(1);
     
    406525              onlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
    407526            }
    408           } else
     527          }
     528          else
    409529            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    410530        }
    411531        dvOnline.Invalidate();
    412       } else {
     532        return true;
     533      }
     534      else
     535      {
    413536        MessageBox.Show("Error in create appointment, please fill out all textboxes!", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    414       }
    415     }
    416 
    417     void DvOnline_OnResolveAppointments(object sender, ResolveAppointmentsEventArgs e) {
     537        return false;
     538      }
     539    }
     540
     541    private void btCreate_Click(object sender, EventArgs e)
     542    {
     543      if (dvOnline.Selection != SelectionType.Appointment)
     544      {
     545        CreateAppointment();
     546      }
     547      else
     548      {
     549        //now we want to change an existing appointment
     550        if (!dvOnline.SelectedAppointment.Recurring)
     551        {
     552          if (CreateAppointment())
     553            DeleteAppointment();
     554        }
     555        else
     556        {
     557          //change recurring appointment
     558          //check, if only selected appointment has to change or whole recurrence
     559          DialogResult res = MessageBox.Show("Change all events in this series?", "Change recurrences", MessageBoxButtons.YesNo);
     560          if (res != DialogResult.Yes)
     561          {
     562            if (CreateAppointment())
     563              DeleteAppointment();
     564          }
     565          else
     566            ChangeRecurrenceAppointment(dvOnline.SelectedAppointment.RecurringId);
     567        }
     568      }
     569    }
     570
     571    private void ChangeRecurrenceAppointment(Guid recurringId)
     572    {
     573      List<Appointment> recurringAppointments = onlineTimes.Where(appointment => appointment.RecurringId == recurringId).ToList();
     574      recurringAppointments.ForEach(appointment => appointment.StartDate = DateTime.Parse(appointment.StartDate.Date + " " + txttimeFrom.Text));
     575      recurringAppointments.ForEach(appointment => appointment.EndDate = DateTime.Parse(appointment.EndDate.Date + " " + txttimeTo.Text));
     576
     577      DeleteRecurringAppointment(recurringId);
     578      onlineTimes.AddRange(recurringAppointments);
     579    }
     580
     581    private void DvOnline_OnResolveAppointments(object sender, ResolveAppointmentsEventArgs e)
     582    {
    418583      List<Appointment> Apps = new List<Appointment>();
    419584
     
    425590    }
    426591
    427     void DvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e) {
     592    private void DvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e)
     593    {
    428594      Appointment Appointment = new Appointment();
    429595
     
    434600    }
    435601
    436     private void btnRecurrence_Click(object sender, EventArgs e) {
    437       Form recurrence = new Recurrence();
     602    private void btnRecurrence_Click(object sender, EventArgs e)
     603    {
     604      Recurrence recurrence = new Recurrence();
     605      recurrence.dialogClosedDelegate = new OnDialogClosedDelegate(this.DialogClosed);
    438606      recurrence.Show();
    439607    }
    440608
     609    public void DialogClosed(RecurrentEvent e)
     610    {
     611      CreateDailyRecurrenceAppointments(e.DateFrom, e.DateTo, e.AllDay, e.IncWeeks, e.WeekDays);
     612    }
     613
    441614    #endregion
    442615
     616    private void CreateDailyRecurrenceAppointments(DateTime dateFrom, DateTime dateTo, bool allDay, int incWeek, HashSet<DayOfWeek> daysOfWeek)
     617    {
     618      DateTime incDate = dateFrom;
     619      Guid guid = Guid.NewGuid();
     620
     621      while (incDate.Date <= dateTo.Date)
     622      {
     623        if (daysOfWeek.Contains(incDate.Date.DayOfWeek))
     624          onlineTimes.Add(CreateAppointment(incDate, new DateTime(incDate.Year, incDate.Month, incDate.Day, dateTo.Hour, dateTo.Minute, 0), allDay, true, guid));
     625        incDate = incDate.AddDays(1);
     626      }
     627
     628      dvOnline.Invalidate();
     629    }
    443630  }
    444631}
Note: See TracChangeset for help on using the changeset viewer.