Index: Core/Common/src/Core.Common.Controls/DataGrid/DataGridViewControl.cs =================================================================== diff -u -rac1e7b044016869e0c2b7668171c0dbfe0be1788 -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Core/Common/src/Core.Common.Controls/DataGrid/DataGridViewControl.cs (.../DataGridViewControl.cs) (revision ac1e7b044016869e0c2b7668171c0dbfe0be1788) +++ Core/Common/src/Core.Common.Controls/DataGrid/DataGridViewControl.cs (.../DataGridViewControl.cs) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -44,6 +44,18 @@ } /// + /// Returns true when the is in edit mode. + /// False otherwise. + /// + public bool IsCurrentCellInEditMode + { + get + { + return dataGridView.IsCurrentCellInEditMode; + } + } + + /// /// Adds a new to the with the given data. /// /// The of the column. @@ -135,6 +147,14 @@ } /// + /// Adjusts the width of all columns to fit the contents of all their cells, including the header cells. + /// + public void AutoResizeColumns() + { + dataGridView.AutoResizeColumns(); + } + + /// /// Ends the editing when the current cell is in edit mode. /// Sets the current cell to null. /// @@ -149,6 +169,15 @@ } /// + /// Gets all the rows of the . + /// + /// A with all the rows of the . + public DataGridViewRowCollection GetRows() + { + return dataGridView.Rows; + } + + /// /// Gets the on the given index. /// /// The index of the row. @@ -160,6 +189,16 @@ } /// + /// Gets the row containing the current cell. + /// + /// The that represents the row containing the current cell, + /// or null if there is no current cell. + public DataGridViewRow GetCurrentRow() + { + return dataGridView.CurrentRow; + } + + /// /// Gets the on the given row and column index. /// /// The index of the row the cell is on. @@ -171,6 +210,17 @@ return GetRowFromIndex(rowIndex).Cells[columnIndex]; } + /// + /// Gets the on the given index. + /// + /// The index of the column. + /// A . + /// Thrown when the index of the column does not exist. + public DataGridViewColumn GetColumnFromIndex(int columnIndex) + { + return dataGridView.Columns[columnIndex]; + } + #region Styling /// @@ -218,6 +268,15 @@ dataGridView.CellFormatting += handler; } + /// + /// Add a handler for the event. + /// + /// The handler to add. + public void AddCellClickHandler(DataGridViewCellEventHandler handler) + { + dataGridView.CellClick += handler; + } + private void SubscribeEvents() { dataGridView.CurrentCellDirtyStateChanged += DataGridViewOnCurrentCellDirtyStateChanged; Index: Core/Common/test/Core.Common.Controls.Test/DataGrid/DataGridViewControlTest.cs =================================================================== diff -u -r5341ef6e47326ef870d7e6f918c9085d7073d3c9 -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Core/Common/test/Core.Common.Controls.Test/DataGrid/DataGridViewControlTest.cs (.../DataGridViewControlTest.cs) (revision 5341ef6e47326ef870d7e6f918c9085d7073d3c9) +++ Core/Common/test/Core.Common.Controls.Test/DataGrid/DataGridViewControlTest.cs (.../DataGridViewControlTest.cs) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -81,6 +81,69 @@ } [Test] + public void IsCurrentCellInEditMode_CurrentCellInEditMode_ReturnsTrue() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + // Make sure the cell is not in edit mode when setting the current cell. + dataGridView.EditMode = DataGridViewEditMode.EditProgrammatically; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + + var dataGridViewCell = dataGridView.Rows[0].Cells[0]; + dataGridView.CurrentCell = dataGridViewCell; + dataGridView.BeginEdit(false); + + // Call + bool editMode = control.IsCurrentCellInEditMode; + + // Assert + Assert.IsTrue(editMode); + } + } + + [Test] + public void IsCurrentCellInEditMode_CurrentCellNotInEditMode_ReturnsFalse() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + // Make sure the cell is not in edit mode when setting the current cell. + dataGridView.EditMode = DataGridViewEditMode.EditProgrammatically; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + + var dataGridViewCell = dataGridView.Rows[0].Cells[0]; + dataGridView.CurrentCell = dataGridViewCell; + + // Call + bool editMode = control.IsCurrentCellInEditMode; + + // Assert + Assert.IsFalse(editMode); + } + } + + [Test] [TestCase(true)] [TestCase(false)] public void AddTextBoxColumn_Always_AddsColumnToDataGridView(bool readOnly) @@ -283,6 +346,31 @@ } [Test] + public void GetRows_Always_ReturnsAllDataGridViewRows() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "Row 1", "Row 2" }; + + // Call + DataGridViewRowCollection rows = control.GetRows(); + + // Assert + Assert.AreEqual(2, rows.Count); + } + } + + [Test] public void GetRowFromIndex_RowDoesExist_ReturnsRow() { // Setup @@ -333,6 +421,59 @@ } [Test] + public void GetCurrentRow_CurrentCellSet_ReturnsRow() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + var dataGridViewCell = dataGridView.Rows[0].Cells[0]; + dataGridView.CurrentCell = dataGridViewCell; + + // Call + DataGridViewRow row = control.GetCurrentRow(); + + // Assert + Assert.IsNotNull(row); + } + } + + [Test] + public void GetCurrentRow_CurrentCellNotSet_ReturnsNull() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + dataGridView.CurrentCell = null; + + // Call + DataGridViewRow row = control.GetCurrentRow(); + + // Assert + Assert.IsNull(row); + } + } + + [Test] public void GetCell_RowAndCellDoesExist_ReturnsCell() { // Setup @@ -408,6 +549,60 @@ } [Test] + public void GetColumnFromIndex_ColumnDoesExist_ReturnsColumn() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + var dataPropertyName = "Test property"; + var testHeader = "Test header"; + control.AddTextBoxColumn(dataPropertyName, testHeader); + + dataGridView.DataSource = new[] { "" }; + + // Call + DataGridViewColumn column = control.GetColumnFromIndex(0); + + // Assert + Assert.IsNotNull(column); + Assert.AreEqual(dataPropertyName, column.DataPropertyName); + Assert.AreEqual(testHeader, column.HeaderText); + } + } + + [Test] + public void GetColumnFromIndex_ColumnDoesNotExist_ThrowsArgumentOutOfRangeException() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + + // Call + TestDelegate call = () => control.GetColumnFromIndex(5); + + // Assert + Assert.Throws(call); + } + } + + [Test] public void DisableCell_Always_DisablesCell() { // Setup @@ -542,6 +737,40 @@ } [Test] + public void AddCellClickHandler_Always_AddsEventHandler() + { + // Setup + using (var form = new Form()) + { + var control = new DataGridViewControl(); + form.Controls.Add(control); + form.Show(); + + var gridTester = new ControlTester("dataGridView"); + var dataGridView = (DataGridView)gridTester.TheObject; + + control.AddTextBoxColumn("Test property", "Test header"); + + dataGridView.DataSource = new[] { "" }; + var dataGridViewCell = dataGridView.Rows[0].Cells[0]; + dataGridView.CurrentCell = dataGridViewCell; + + int counter = 0; + + control.AddCellClickHandler((sender, args) => counter++); + + // Precondition + Assert.AreEqual(0, counter); + + // Call + gridTester.FireEvent("CellClick", new DataGridViewCellEventArgs(0, 0)); + + // Assert + Assert.AreEqual(1, counter); + } + } + + [Test] public void DataGridViewControlCheckBoxColumn_EditValueDirtyStateChangedEventFired_ValueCommittedCellInEditMode() { // Setup Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.Designer.cs =================================================================== diff -u -r7b59ab6aaa9f81445151848d8b3aa651062ee6b7 -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.Designer.cs (.../PipingCalculationsView.Designer.cs) (revision 7b59ab6aaa9f81445151848d8b3aa651062ee6b7) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.Designer.cs (.../PipingCalculationsView.Designer.cs) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -23,18 +23,17 @@ this.labelFailureMechanismSections = new System.Windows.Forms.Label(); this.tableLayoutPanelDataGrid = new System.Windows.Forms.TableLayoutPanel(); this.labelCalculations = new System.Windows.Forms.Label(); - this.dataGridView = new System.Windows.Forms.DataGridView(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.buttonGenerateScenarios = new System.Windows.Forms.Button(); this.buttonNavigateToSelectedCalculation = new System.Windows.Forms.Button(); + this.dataGridViewControl = new Core.Common.Controls.DataGrid.DataGridViewControl(); this.tableLayoutPanelUserControl.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); this.tableLayoutPanelListBox.SuspendLayout(); this.tableLayoutPanelDataGrid.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // @@ -81,27 +80,14 @@ // resources.ApplyResources(this.tableLayoutPanelDataGrid, "tableLayoutPanelDataGrid"); this.tableLayoutPanelDataGrid.Controls.Add(this.labelCalculations, 0, 0); - this.tableLayoutPanelDataGrid.Controls.Add(this.dataGridView, 0, 1); + this.tableLayoutPanelDataGrid.Controls.Add(this.dataGridViewControl, 0, 1); this.tableLayoutPanelDataGrid.Name = "tableLayoutPanelDataGrid"; // // labelCalculations // resources.ApplyResources(this.labelCalculations, "labelCalculations"); this.labelCalculations.Name = "labelCalculations"; // - // dataGridView - // - this.dataGridView.AllowUserToAddRows = false; - this.dataGridView.AllowUserToDeleteRows = false; - this.dataGridView.AllowUserToResizeColumns = false; - this.dataGridView.AllowUserToResizeRows = false; - this.dataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader; - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - resources.ApplyResources(this.dataGridView, "dataGridView"); - this.dataGridView.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; - // // tableLayoutPanel1 // resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); @@ -122,6 +108,11 @@ this.buttonNavigateToSelectedCalculation.Name = "buttonNavigateToSelectedCalculation"; this.buttonNavigateToSelectedCalculation.UseVisualStyleBackColor = true; // + // dataGridViewControl + // + resources.ApplyResources(this.dataGridViewControl, "dataGridViewControl"); + this.dataGridViewControl.Name = "dataGridViewControl"; + // // PipingCalculationsView // resources.ApplyResources(this, "$this"); @@ -137,7 +128,6 @@ this.tableLayoutPanelListBox.PerformLayout(); this.tableLayoutPanelDataGrid.ResumeLayout(false); this.tableLayoutPanelDataGrid.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); this.tableLayoutPanel1.ResumeLayout(false); this.ResumeLayout(false); @@ -152,9 +142,9 @@ private System.Windows.Forms.Label labelFailureMechanismSections; private System.Windows.Forms.TableLayoutPanel tableLayoutPanelDataGrid; private System.Windows.Forms.Label labelCalculations; - private System.Windows.Forms.DataGridView dataGridView; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Button buttonGenerateScenarios; private System.Windows.Forms.Button buttonNavigateToSelectedCalculation; + private Core.Common.Controls.DataGrid.DataGridViewControl dataGridViewControl; } } Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs =================================================================== diff -u -r0d1a1a5d6962e334a56ec7fd0c83488c6f377ca3 -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision 0d1a1a5d6962e334a56ec7fd0c83488c6f377ca3) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -55,11 +55,13 @@ private readonly Observer pipingFailureMechanismObserver; private readonly Observer pipingStochasticSoilModelsObserver; private IAssessmentSection assessmentSection; - private DataGridViewComboBoxColumn hydraulicBoundaryLocationColumn; private CalculationGroup calculationGroup; private PipingFailureMechanism pipingFailureMechanism; - private DataGridViewComboBoxColumn stochasticSoilModelColumn; - private DataGridViewComboBoxColumn stochasticSoilProfileColumn; + + private const int stochasticSoilModelColumnIndex = 3; + private const int stochasticSoilProfileColumnIndex = 4; + private const int hydraulicBoundaryLocationColumnIndex = 6; + private bool updatingDataSource; /// @@ -77,7 +79,7 @@ // The concat is needed to observe the input of calculations in child groups. pipingInputObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children.Concat(pcg.Children.OfType().Select(pc => pc.InputParameters))); pipingCalculationGroupObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children); - pipingCalculationObserver = new RecursiveObserver(RefreshDataGridView, pcg => pcg.Children); + pipingCalculationObserver = new RecursiveObserver(dataGridViewControl.RefreshDataGridView, pcg => pcg.Children); } /// @@ -145,7 +147,7 @@ } else { - dataGridView.DataSource = null; + dataGridViewControl.SetDataSource(null); pipingInputObserver.Observable = null; pipingCalculationObserver.Observable = null; pipingCalculationGroupObserver.Observable = null; @@ -155,9 +157,6 @@ protected override void Dispose(bool disposing) { - AssessmentSection = null; - PipingFailureMechanism = null; - assessmentSectionObserver.Dispose(); pipingFailureMechanismObserver.Dispose(); pipingInputObserver.Dispose(); @@ -175,119 +174,44 @@ private void InitializeDataGridView() { - dataGridView.CurrentCellDirtyStateChanged += DataGridViewCurrentCellDirtyStateChanged; - dataGridView.GotFocus += DataGridViewGotFocus; - dataGridView.CellClick += DataGridViewOnCellClick; - dataGridView.CellValidating += DataGridViewCellValidating; - dataGridView.DataError += DataGridViewDataError; + dataGridViewControl.AddCellClickHandler(DataGridViewOnCellClick); - var relevantColumn = new DataGridViewCheckBoxColumn - { - DataPropertyName = "IsRelevant", - HeaderText = Resources.PipingCalculationsView_InitializeDataGridView_In_final_rating, - Name = "column_IsRelevant" - }; + dataGridViewControl.AddCheckBoxColumn("IsRelevant", Resources.PipingCalculationsView_InitializeDataGridView_In_final_rating); + dataGridViewControl.AddTextBoxColumn("Contribution", Resources.PipingCalculationsView_InitializeDataGridView_Contribution); + dataGridViewControl.AddTextBoxColumn("Name", Resources.PipingCalculation_Name_DisplayName); - var contributionColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "Contribution", - HeaderText = Resources.PipingCalculationsView_InitializeDataGridView_Contribution, - Name = "column_Contribution" - }; + dataGridViewControl.AddComboBoxColumn>("StochasticSoilModel", + Resources.PipingInput_StochasticSoilModel_DisplayName, + null, + wrapper => wrapper.This, + wrapper => wrapper.DisplayName); - var nameColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "Name", - HeaderText = Resources.PipingCalculation_Name_DisplayName, - Name = "column_Name" - }; + dataGridViewControl.AddComboBoxColumn>("StochasticSoilProfile", + Resources.PipingInput_StochasticSoilProfile_DisplayName, + null, + wrapper => wrapper.This, + wrapper => wrapper.DisplayName); - stochasticSoilModelColumn = new DataGridViewComboBoxColumn - { - DataPropertyName = "StochasticSoilModel", - HeaderText = Resources.PipingInput_StochasticSoilModel_DisplayName, - Name = "column_SoilModel", - ValueMember = "This", - DisplayMember = "DisplayName" - }; + dataGridViewControl.AddTextBoxColumn("StochasticSoilProfileProbability", Resources.PipingCalculationsView_InitializeDataGridView_Stochastic_soil_profile_probability); - stochasticSoilProfileColumn = new DataGridViewComboBoxColumn - { - DataPropertyName = "StochasticSoilProfile", - HeaderText = Resources.PipingInput_StochasticSoilProfile_DisplayName, - Name = "column_SoilProfile", - ValueMember = "This", - DisplayMember = "DisplayName" - }; + dataGridViewControl.AddComboBoxColumn>("HydraulicBoundaryLocation", + Resources.PipingInput_HydraulicBoundaryLocation_DisplayName, + null, + wrapper => wrapper.This, + wrapper => wrapper.DisplayName); - var stochasticSoilProfileProbabilityColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "StochasticSoilProfileProbability", - HeaderText = Resources.PipingCalculationsView_InitializeDataGridView_Stochastic_soil_profile_probability, - Name = "column_SoilProfileProbability", - }; - - hydraulicBoundaryLocationColumn = new DataGridViewComboBoxColumn - { - DataPropertyName = "HydraulicBoundaryLocation", - HeaderText = Resources.PipingInput_HydraulicBoundaryLocation_DisplayName, - Name = "column_HydraulicBoundaryLocation", - ValueMember = "This", - DisplayMember = "DisplayName" - }; - var dampingFactorExitHeader = Resources.PipingInput_DampingFactorExit_DisplayName; dampingFactorExitHeader = char.ToLowerInvariant(dampingFactorExitHeader[0]) + dampingFactorExitHeader.Substring(1); - var dampingFactorExitMeanColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "DampingFactorExitMean", - HeaderText = string.Format("{0} {1}", Resources.Probabilistics_Mean_Symbol, dampingFactorExitHeader), - Name = "column_DampingFactorExitMean" - }; + dataGridViewControl.AddTextBoxColumn("DampingFactorExitMean", string.Format("{0} {1}", Resources.Probabilistics_Mean_Symbol, dampingFactorExitHeader)); + var phreaticLevelExitHeader = Resources.PipingInput_PhreaticLevelExit_DisplayName; phreaticLevelExitHeader = char.ToLowerInvariant(phreaticLevelExitHeader[0]) + phreaticLevelExitHeader.Substring(1); - var phreaticLevelExitMeanColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "PhreaticLevelExitMean", - HeaderText = string.Format("{0} {1}", Resources.Probabilistics_Mean_Symbol, phreaticLevelExitHeader), - Name = "column_PhreaticLevelExitMean" - }; - var entryPointLColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "EntryPointL", - HeaderText = Resources.PipingInput_EntryPointL_DisplayName, - Name = "column_EntryPointL" - }; + dataGridViewControl.AddTextBoxColumn("PhreaticLevelExitMean", string.Format("{0} {1}", Resources.Probabilistics_Mean_Symbol, phreaticLevelExitHeader)); + dataGridViewControl.AddTextBoxColumn("EntryPointL", Resources.PipingInput_EntryPointL_DisplayName); + dataGridViewControl.AddTextBoxColumn("ExitPointL", Resources.PipingInput_ExitPointL_DisplayName); - var exitPointLColumn = new DataGridViewTextBoxColumn - { - DataPropertyName = "ExitPointL", - HeaderText = Resources.PipingInput_ExitPointL_DisplayName, - Name = "column_ExitPointL" - }; - - dataGridView.AutoGenerateColumns = false; - dataGridView.Columns.AddRange( - relevantColumn, - contributionColumn, - nameColumn, - stochasticSoilModelColumn, - stochasticSoilProfileColumn, - stochasticSoilProfileProbabilityColumn, - hydraulicBoundaryLocationColumn, - dampingFactorExitMeanColumn, - phreaticLevelExitMeanColumn, - entryPointLColumn, - exitPointLColumn); - - foreach (var column in dataGridView.Columns.OfType()) - { - column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; - column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; - } - UpdateHydraulicBoundaryLocationsColumn(); UpdateStochasticSoilModelColumn(); UpdateStochasticSoilProfileColumn(); @@ -301,6 +225,8 @@ private void UpdateHydraulicBoundaryLocationsColumn() { + DataGridViewComboBoxColumn hydraulicBoundaryLocationColumn = (DataGridViewComboBoxColumn) dataGridViewControl.GetColumnFromIndex(hydraulicBoundaryLocationColumnIndex); + using (new SuspendDataGridViewColumnResizes(hydraulicBoundaryLocationColumn)) { var hydraulicBoundaryLocations = assessmentSection != null && assessmentSection.HydraulicBoundaryDatabase != null @@ -312,9 +238,9 @@ private void UpdateStochasticSoilModelColumn() { - using (new SuspendDataGridViewColumnResizes(stochasticSoilModelColumn)) + using (new SuspendDataGridViewColumnResizes(dataGridViewControl.GetColumnFromIndex(stochasticSoilModelColumnIndex))) { - foreach (DataGridViewRow dataGridViewRow in dataGridView.Rows) + foreach (DataGridViewRow dataGridViewRow in dataGridViewControl.GetRows()) { FillAvailableSoilModelsList(dataGridViewRow); } @@ -323,9 +249,9 @@ private void UpdateStochasticSoilProfileColumn() { - using (new SuspendDataGridViewColumnResizes(stochasticSoilProfileColumn)) + using (new SuspendDataGridViewColumnResizes(dataGridViewControl.GetColumnFromIndex(stochasticSoilProfileColumnIndex))) { - foreach (DataGridViewRow dataGridViewRow in dataGridView.Rows) + foreach (DataGridViewRow dataGridViewRow in dataGridViewControl.GetRows()) { FillAvailableSoilProfilesList(dataGridViewRow); } @@ -344,7 +270,7 @@ var rowData = (PipingCalculationRow) dataGridViewRow.DataBoundItem; IEnumerable stochasticSoilModels = GetSoilModelsForCalculation(rowData.PipingCalculation); - var cell = (DataGridViewComboBoxCell) dataGridViewRow.Cells[stochasticSoilModelColumn.Index]; + var cell = (DataGridViewComboBoxCell) dataGridViewRow.Cells[stochasticSoilModelColumnIndex]; SetItemsOnObjectCollection(cell.Items, GetStochasticSoilModelsDataSource(stochasticSoilModels).ToArray()); } @@ -355,7 +281,7 @@ IEnumerable stochasticSoilProfiles = GetSoilProfilesForCalculation(rowData.PipingCalculation); - var cell = (DataGridViewComboBoxCell) dataGridViewRow.Cells[stochasticSoilProfileColumn.Index]; + var cell = (DataGridViewComboBoxCell) dataGridViewRow.Cells[stochasticSoilProfileColumnIndex]; SetItemsOnObjectCollection(cell.Items, GetSoilProfilesDataSource(stochasticSoilProfiles).ToArray()); } @@ -390,22 +316,22 @@ private void UpdateDataGridViewDataSource() { // Skip changes coming from the view itself - if (dataGridView.IsCurrentCellInEditMode) + if (dataGridViewControl.IsCurrentCellInEditMode) { updatingDataSource = true; UpdateStochasticSoilProfileColumn(); updatingDataSource = false; - dataGridView.AutoResizeColumns(); + dataGridViewControl.AutoResizeColumns(); return; } var failureMechanismSection = listBox.SelectedItem as FailureMechanismSection; if (failureMechanismSection == null || calculationGroup == null) { - dataGridView.DataSource = null; + dataGridViewControl.SetDataSource(null); return; } @@ -418,9 +344,10 @@ PrefillComboBoxListItemsAtColumnLevel(); - dataGridView.DataSource = pipingCalculations.OfType() + var dataSource = pipingCalculations.OfType() .Select(pc => new PipingCalculationRow(pc)) .ToList(); + dataGridViewControl.SetDataSource(dataSource); UpdateStochasticSoilModelColumn(); UpdateStochasticSoilProfileColumn(); @@ -495,6 +422,10 @@ private void PrefillComboBoxListItemsAtColumnLevel() { + DataGridViewComboBoxColumn stochasticSoilModelColumn = (DataGridViewComboBoxColumn) dataGridViewControl.GetColumnFromIndex(stochasticSoilModelColumnIndex); + DataGridViewComboBoxColumn stochasticSoilProfileColumn = (DataGridViewComboBoxColumn)dataGridViewControl.GetColumnFromIndex(stochasticSoilProfileColumnIndex); + DataGridViewComboBoxColumn hydraulicBoundaryLocationColumn = (DataGridViewComboBoxColumn)dataGridViewControl.GetColumnFromIndex(hydraulicBoundaryLocationColumnIndex); + // Need to prefill for all possible data in order to guarantee 'combo box' columns // do not generate errors when their cell value is not present in the list of available // items. @@ -729,25 +660,6 @@ # region Event handling - private void DataGridViewCurrentCellDirtyStateChanged(object sender, EventArgs e) - { - // Ensure combobox values are directly committed - DataGridViewColumn currentColumn = dataGridView.Columns[dataGridView.CurrentCell.ColumnIndex]; - if (currentColumn is DataGridViewComboBoxColumn || currentColumn is DataGridViewCheckBoxColumn) - { - dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); - dataGridView.EndEdit(); - } - } - - private void DataGridViewGotFocus(object sender, EventArgs eventArgs) - { - if (dataGridView.CurrentCell != null) - { - dataGridView.BeginEdit(true); // Always start editing after setting the focus (otherwise data grid view cell dirty events are no longer fired when using the keyboard...) - } - } - private void DataGridViewOnCellClick(object sender, DataGridViewCellEventArgs e) { if (updatingDataSource) @@ -758,40 +670,12 @@ UpdateApplicationSelection(); } - private void DataGridViewCellValidating(object sender, DataGridViewCellValidatingEventArgs e) - { - dataGridView.Rows[e.RowIndex].ErrorText = String.Empty; - - var cellEditValue = e.FormattedValue.ToString(); - if (string.IsNullOrWhiteSpace(cellEditValue)) - { - dataGridView.Rows[e.RowIndex].ErrorText = CoreCommonControlsResources.DataGridViewCellValidating_Text_may_not_be_empty; - } - } - - private void DataGridViewDataError(object sender, DataGridViewDataErrorEventArgs e) - { - e.ThrowException = false; - e.Cancel = true; - - if (string.IsNullOrWhiteSpace(dataGridView.Rows[e.RowIndex].ErrorText) && e.Exception != null) - { - dataGridView.Rows[e.RowIndex].ErrorText = e.Exception.Message; - } - } - private void ListBoxOnSelectedValueChanged(object sender, EventArgs e) { UpdateDataGridViewDataSource(); UpdateApplicationSelection(); } - private void RefreshDataGridView() - { - dataGridView.Refresh(); - dataGridView.AutoResizeColumns(); - } - private void OnGenerateScenariosButtonClick(object sender, EventArgs e) { if (calculationGroup == null) @@ -847,8 +731,10 @@ return; } - var pipingCalculationRow = dataGridView.CurrentRow != null - ? (PipingCalculationRow) dataGridView.CurrentRow.DataBoundItem + var currentRow = dataGridViewControl.GetCurrentRow(); + + var pipingCalculationRow = currentRow != null + ? (PipingCalculationRow)currentRow.DataBoundItem : null; PipingInputContext selection = null; Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.resx =================================================================== diff -u -re9126cf0eaf73660d9c85fac899a6324291c7ebe -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.resx (.../PipingCalculationsView.resx) (revision e9126cf0eaf73660d9c85fac899a6324291c7ebe) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.resx (.../PipingCalculationsView.resx) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -169,7 +169,7 @@ 3, 0 - 44, 13 + 26, 13 0 @@ -264,31 +264,28 @@ 0 - + Fill - - 3, 20 + + 3, 23 - - 3, 0, 3, 0 + + 537, 496 - - 537, 502 - - + 1 - - dataGridView + + dataGridViewControl - - System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Core.Common.Controls.DataGrid.DataGridViewControl, Core.Common.Controls, Version=0.5.0.3232, Culture=neutral, PublicKeyToken=null - + tableLayoutPanelDataGrid - + 1 @@ -319,7 +316,7 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="labelCalculations" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="dataGridView" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Absolute,20,Percent,100" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="labelCalculations" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="dataGridViewControl" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Absolute,20,Percent,100" /></TableLayoutSettings> splitContainer.Panel2 @@ -483,9 +480,9 @@ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="splitContainer" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="tableLayoutPanel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,32" /></TableLayoutSettings> - + True - + 6, 13 Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs =================================================================== diff -u -rec5eeafbbd987b02a9d9c07b7e920c03d567f3f7 -rd48d2c62b4a2d2f177e1725e1b84e54a8d49327f --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs (.../PipingCalculationsViewTest.cs) (revision ec5eeafbbd987b02a9d9c07b7e920c03d567f3f7) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs (.../PipingCalculationsViewTest.cs) (revision d48d2c62b4a2d2f177e1725e1b84e54a8d49327f) @@ -98,12 +98,6 @@ Assert.AreEqual("DisplayName", column.DisplayMember); } - foreach (var column in dataGridView.Columns.OfType()) - { - Assert.AreEqual(DataGridViewAutoSizeColumnMode.AllCells, column.AutoSizeMode); - Assert.AreEqual(DataGridViewContentAlignment.MiddleCenter, column.HeaderCell.Style.Alignment); - } - var soilProfilesCombobox = (DataGridViewComboBoxColumn) dataGridView.Columns[stochasticSoilProfilesColumnIndex]; var soilProfilesComboboxItems = soilProfilesCombobox.Items; Assert.AreEqual(0, soilProfilesComboboxItems.Count); // Row dependend @@ -140,35 +134,6 @@ } [Test] - public void Dispose_PipingCalculationViewWithAdditionalPropertiesSet_AdditionalPropertiesSetToNull() - { - // Setup - var mocks = new MockRepository(); - var pipingFailureMechanism = mocks.StrictMock(); - var assessmentSection = mocks.Stub(); - - mocks.ReplayAll(); - - using (var pipingCalculationsView = new PipingCalculationsView - { - PipingFailureMechanism = pipingFailureMechanism, - AssessmentSection = assessmentSection, - }) - { - // Precondition - Assert.IsNotNull(pipingCalculationsView.PipingFailureMechanism); - Assert.IsNotNull(pipingCalculationsView.AssessmentSection); - - // Call - pipingCalculationsView.Dispose(); - - // Assert - Assert.IsNull(pipingCalculationsView.PipingFailureMechanism); - Assert.IsNull(pipingCalculationsView.AssessmentSection); - } - } - - [Test] public void AssessmentSection_HydraulicBoundaryDatabaseNull_HydraulicBoundaryLocationsComboboxCorrectlyInitialized() { // Setup