Delete handler subscriptions from controls (memory leak if not done???), ver. 2.18.1298

This commit is contained in:
Milan Hanajik 2019-08-26 14:53:41 +02:00
parent c3d5e157ec
commit ff3118068d
2 changed files with 32 additions and 13 deletions

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("2.18.1297.0")]
[assembly: AssemblyFileVersion("2.18.1297.0")]
[assembly: AssemblyVersion("2.18.1298.0")]
[assembly: AssemblyFileVersion("2.18.1298.0")]

View File

@ -418,6 +418,7 @@ namespace TBF.Screens
if ((results == null) || (results.WMPositionsCount == 0))
{
/// There are no water meters at all
DeleteHandlers();
flowLayoutPanel.Controls.Clear();
wmRsltsCtrl = new OneWMResultsRowsCtrl[0];
firstEnabledControl = null;
@ -465,6 +466,7 @@ namespace TBF.Screens
/// Create controls and fill the FlowLayoutPanel
///
flowLayoutPanel.SuspendLayout();
DeleteHandlers();
flowLayoutPanel.Controls.Clear();
flowLayoutPanel.WrapContents = true;
flowLayoutPanel.AutoScroll = true;
@ -485,17 +487,7 @@ namespace TBF.Screens
wmRsltsCtrl[ix].Width = oneWidth;
wmRsltsCtrl[ix].Height = oneHeight;
wmRsltsCtrl[ix].Update(currentItems);
wmRsltsCtrl[ix].WMResultsClickedHandler += delegate(object s, Results.Forms.WaterMeterEventArgs args)
{
if (InvokeRequired)
{
Invoke(new EventHandler<Results.Forms.WaterMeterEventArgs>(OnDoubleClick), s, args);
}
else
{
OnDoubleClick(s, args);
}
};
wmRsltsCtrl[ix].WMResultsClickedHandler += HandleDoubleClick;
flowLayoutPanel.Controls.Add(wmRsltsCtrl[ix] as UserControl);
if ((firstEnabledControl == null) && !results.WaterMeters[i].Disabled) firstEnabledControl = wmRsltsCtrl[ix];
@ -509,6 +501,33 @@ namespace TBF.Screens
flowLayoutPanel.ResumeLayout();
}
void HandleDoubleClick(object s, WaterMeterEventArgs args)
{
if (InvokeRequired)
{
Invoke(new EventHandler<Results.Forms.WaterMeterEventArgs>(OnDoubleClick), s, args);
}
else
{
OnDoubleClick(s, args);
}
}
/// <summary>
/// Delete handler subscriptions from controls (memory leak if not done???).
/// To be done before flowLayoutPanel.Controls.Clear().
/// </summary>
void DeleteHandlers()
{
foreach (var ctrl in flowLayoutPanel.Controls)
{
if (ctrl is IOneWMResultsCtrl)
{
(ctrl as IOneWMResultsCtrl).WMResultsClickedHandler -= HandleDoubleClick;
}
}
}
void UpdateResults(Results.BatchResults batchResults)
{