Index: Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenarioRow.cs =================================================================== diff -u -ree4e41283cef2e918d2424b5568d593310a656e4 -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 --- Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenarioRow.cs (.../ScenarioRow.cs) (revision ee4e41283cef2e918d2424b5568d593310a656e4) +++ Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenarioRow.cs (.../ScenarioRow.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) @@ -91,5 +91,10 @@ /// [TypeConverter(typeof(NoProbabilityValueDoubleConverter))] public abstract string FailureProbability { get; } + + /// + /// Updates the row based on the current output of the . + /// + public abstract void Update(); } } \ No newline at end of file Index: Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs =================================================================== diff -u -rc216977d4793abacb072a2e1bcd059df9d91b4c4 -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 --- Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs (.../ScenariosView.cs) (revision c216977d4793abacb072a2e1bcd059df9d91b4c4) +++ Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs (.../ScenariosView.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) @@ -25,6 +25,7 @@ using System.Windows.Forms; using Core.Common.Base; using Core.Common.Controls.Views; +using Core.Common.Util.Extensions; using Riskeer.Common.Data.Calculation; using Riskeer.Common.Data.FailureMechanism; using Riskeer.Common.Forms.Properties; @@ -43,7 +44,10 @@ private readonly IFailureMechanism failureMechanism; private readonly Observer failureMechanismObserver; - private RecursiveObserver calculationGroupObserver; + private readonly RecursiveObserver calculationGroupObserver; + private readonly RecursiveObserver calculationObserver; + + private IEnumerable scenarioRows; /// /// Creates a new instance of . @@ -80,6 +84,11 @@ Observable = calculationGroup }; + calculationObserver = new RecursiveObserver(UpdateScenarioRows, pcg => pcg.Children) + { + Observable = calculationGroup + }; + InitializeComponent(); InitializeListBox(); @@ -105,6 +114,7 @@ { failureMechanismObserver.Dispose(); calculationGroupObserver.Dispose(); + calculationObserver.Dispose(); if (disposing) { @@ -122,7 +132,7 @@ return; } - IEnumerable scenarioRows = GetScenarioRows(); + scenarioRows = GetScenarioRows(); dataGridViewControl.SetDataSource(scenarioRows); } @@ -167,5 +177,11 @@ { UpdateDataGridViewDataSource(); } + + private void UpdateScenarioRows() + { + scenarioRows.ForEachElementDo(row => row.Update()); + dataGridViewControl.RefreshDataGridView(); + } } } \ No newline at end of file Index: Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenarioRowTest.cs =================================================================== diff -u -ree4e41283cef2e918d2424b5568d593310a656e4 -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 --- Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenarioRowTest.cs (.../ScenarioRowTest.cs) (revision ee4e41283cef2e918d2424b5568d593310a656e4) +++ Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenarioRowTest.cs (.../ScenarioRowTest.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) @@ -122,6 +122,8 @@ : base(calculationScenario) {} public override string FailureProbability { get; } + + public override void Update() {} } } } \ No newline at end of file Index: Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs =================================================================== diff -u -re71c76d2a2ec7402b4a273bf8eaa73bf9dba9079 -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 --- Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision e71c76d2a2ec7402b4a273bf8eaa73bf9dba9079) +++ Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) @@ -219,8 +219,8 @@ var failureMechanism = new TestFailureMechanism(); ShowFullyConfiguredScenarioView(new CalculationGroup(), failureMechanism); - var listBox = (ListBox)new ControlTester("listBox").TheObject; - var dataGridView = (DataGridView)new ControlTester("dataGridView").TheObject; + var listBox = (ListBox) new ControlTester("listBox").TheObject; + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; // Precondition Assert.AreSame(failureMechanism.Sections.First(), listBox.SelectedItem); @@ -339,6 +339,36 @@ CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows); } + [Test] + public void GivenScenarioView_WhenCalculationNotifiesObserver_ThenViewUpdated() + { + // Given + var calculationGroup = new CalculationGroup(); + ShowFullyConfiguredScenarioView(calculationGroup, new TestFailureMechanism()); + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + var refreshed = 0; + dataGridView.Invalidated += (sender, args) => refreshed++; + + var scenarioRows = new List(); + foreach (DataGridViewRow row in dataGridView.Rows) + { + scenarioRows.Add((TestScenarioRow) row.DataBoundItem); + } + + // Precondition + Assert.IsTrue(scenarioRows.All(row => !row.Updated)); + + ICalculation calculation = calculationGroup.GetCalculations().First(); + + // When + calculation.NotifyObservers(); + + // Then + Assert.AreEqual(1, refreshed); + Assert.IsTrue(scenarioRows.All(row => row.Updated)); + } + private void ShowFullyConfiguredScenarioView(CalculationGroup calculationGroup, IFailureMechanism failureMechanism) { FailureMechanismTestHelper.SetSections(failureMechanism, new[] @@ -400,6 +430,13 @@ : base(calculationScenario) {} public override string FailureProbability => "1"; + + public bool Updated { get; private set; } + + public override void Update() + { + Updated = true; + } } } } \ No newline at end of file