public void It_Should_Call_Back_To_The_Main_Panel() { var form = MockRepository.GenerateMock <ISimpleDBMergeResultForm>(); var results = new DatabaseMergeResult(); var panel = MockRepository.GenerateMock <IMainPanel>(); var tableOp = MockRepository.GenerateMock <IMergeOperation <ITable> >(); var columnOp = MockRepository.GenerateMock <IMergeOperation <IColumn> >(); var keyOp = MockRepository.GenerateMock <IMergeOperation <IKey> >(); var indexOp = MockRepository.GenerateMock <IMergeOperation <IIndex> >(); results.AddTableOperation(tableOp); results.AddColumnOperation(columnOp); results.AddKeyOperation(keyOp); results.AddIndexOperation(indexOp); new SimpleDBMergeResultPresenter(form, panel, results); form.GetEventRaiser(f => f.ChangesCancelled += null).Raise(form, null); panel.AssertWasCalled(f => f.CloseDatabaseRefreshResultsForm(Changes.WereRejected)); tableOp.AssertWasNotCalled(o => o.RunOperation()); columnOp.AssertWasNotCalled(o => o.RunOperation()); keyOp.AssertWasNotCalled(o => o.RunOperation()); indexOp.AssertWasNotCalled(o => o.RunOperation()); }
public void All_Of_The_Operations_Are_Put_Into_The_Result() { var columnOp = MockRepository.GenerateMock <MergeOperation <IColumn> >(); var tableOp = MockRepository.GenerateMock <MergeOperation <ITable> >(); var keyOp = MockRepository.GenerateMock <MergeOperation <IKey> >(); var indexOp = MockRepository.GenerateMock <MergeOperation <IIndex> >(); DatabaseMergeResult result1 = new DatabaseMergeResult(); result1.AddColumnOperation(columnOp); result1.AddTableOperation(tableOp); result1.AddKeyOperation(keyOp); result1.AddIndexOperation(indexOp); DatabaseMergeResult result2 = new DatabaseMergeResult(); result2.CopyFrom(result1); Assert.That(result1.ColumnOperations, Has.Count(1)); Assert.That(result1.TableOperations, Has.Count(1)); Assert.That(result1.KeyOperations, Has.Count(1)); Assert.That(result1.IndexOperations, Has.Count(1)); Assert.That(result1.ColumnOperations.ElementAt(0), Is.SameAs(columnOp)); Assert.That(result1.TableOperations.ElementAt(0), Is.SameAs(tableOp)); Assert.That(result1.KeyOperations.ElementAt(0), Is.SameAs(keyOp)); Assert.That(result1.IndexOperations.ElementAt(0), Is.SameAs(indexOp)); }
public void All_Of_The_Operations_Are_Put_Into_The_Result() { var columnOp = MockRepository.GenerateMock<MergeOperation<IColumn>>(); var tableOp = MockRepository.GenerateMock<MergeOperation<ITable>>(); var keyOp = MockRepository.GenerateMock<MergeOperation<IKey>>(); var indexOp = MockRepository.GenerateMock<MergeOperation<IIndex>>(); DatabaseMergeResult result1 = new DatabaseMergeResult(); result1.AddColumnOperation(columnOp); result1.AddTableOperation(tableOp); result1.AddKeyOperation(keyOp); result1.AddIndexOperation(indexOp); DatabaseMergeResult result2 = new DatabaseMergeResult(); result2.CopyFrom(result1); Assert.That(result1.ColumnOperations, Has.Count(1)); Assert.That(result1.TableOperations, Has.Count(1)); Assert.That(result1.KeyOperations, Has.Count(1)); Assert.That(result1.IndexOperations, Has.Count(1)); Assert.That(result1.ColumnOperations.ElementAt(0), Is.SameAs(columnOp)); Assert.That(result1.TableOperations.ElementAt(0), Is.SameAs(tableOp)); Assert.That(result1.KeyOperations.ElementAt(0), Is.SameAs(keyOp)); Assert.That(result1.IndexOperations.ElementAt(0), Is.SameAs(indexOp)); }
public SimpleDBMergeResultPresenter( ISimpleDBMergeResultForm form, IMainPanel panel, DatabaseMergeResult results) : base(panel) { this.form = form; this.results = results; SetupForm(); }
public void The_Event_Handlers_Are_Registered() { var form = MockRepository.GenerateMock <ISimpleDBMergeResultForm>(); var results = new DatabaseMergeResult(); var panel = MockRepository.GenerateStub <IMainPanel>(); new SimpleDBMergeResultPresenter(form, panel, results); form.AssertWasCalled(f => f.ChangesAccepted += null, c => c.IgnoreArguments()); form.AssertWasCalled(f => f.ChangesCancelled += null, c => c.IgnoreArguments()); }
public void It_Should_Call_Back_To_The_Main_Panel() { var form = MockRepository.GenerateMock <ISimpleDBMergeResultForm>(); var results = new DatabaseMergeResult(); var panel = MockRepository.GenerateMock <IMainPanel>(); var presenter = new SimpleDBMergeResultPresenter(form, panel, results); presenter.Show(); panel.AssertWasCalled(f => f.ShowDatabaseRefreshResultsForm(form)); }
public void The_Operations_Come_Back_In_A_Good_Order() { DatabaseMergeResult result = new DatabaseMergeResult(); result.AddIndexOperation(new IndexAdditionOperation(new Table(), new Index())); result.AddKeyOperation(new KeyAdditionOperation(new Table(), new Key())); // Not a ITwoStepMergeOperation result.AddTableOperation(new TableAdditionOperation(new Database(""), new Table())); IEnumerable<ITwoStepMergeOperation> list = result.TwoStepOperations; Assert.That(list, Has.Count(2)); Assert.That(list.ElementAt(0) is KeyAdditionOperation); Assert.That(list.ElementAt(1) is IndexAdditionOperation); }
public void The_Operations_Come_Back_In_A_Good_Order() { DatabaseMergeResult result = new DatabaseMergeResult(); result.AddIndexOperation(new IndexAdditionOperation(new Table(), new Index())); result.AddKeyOperation(new KeyAdditionOperation(new Table(), new Key())); // Not a ITwoStepMergeOperation result.AddTableOperation(new TableAdditionOperation(new Database(""), new Table())); IEnumerable <ITwoStepMergeOperation> list = result.TwoStepOperations; Assert.That(list, Has.Count(2)); Assert.That(list.ElementAt(0) is KeyAdditionOperation); Assert.That(list.ElementAt(1) is IndexAdditionOperation); }
public void The_Form_Is_Set_Up_Properly() { var form = MockRepository.GenerateMock <ISimpleDBMergeResultForm>(); var results = new DatabaseMergeResult(); var panel = MockRepository.GenerateStub <IMainPanel>(); var addOp = new TableAdditionOperation(new Database("db"), new Table("table")); var remOp = new TableRemovalOperation(new Table("table")); results.AddTableOperation(addOp); results.AddTableOperation(remOp); new SimpleDBMergeResultPresenter(form, panel, results); // Not the nicest syntax, but this is a test to check that all form.AssertWasCalled(f => f.AddedTableOperations = Arg <IEnumerable <IMergeOperation <ITable> > > .Matches(t => t.Count() == 1 && t.ElementAt(0) == addOp)); form.AssertWasCalled(f => f.RemovedTableOperations = Arg <IEnumerable <IMergeOperation <ITable> > > .Matches(t => t.Count() == 1 && t.ElementAt(0) == remOp)); }
public void It_Should_Apply_Changes_And_Call_Back_To_The_Main_Panel() { var form = MockRepository.GenerateStub <ISimpleDBMergeResultForm>(); var results = new DatabaseMergeResult(); var panel = MockRepository.GenerateMock <IMainPanel>(); // These are all two step processes var tableOp = new MockMergeOperation <ITable, Table>(); var columnOp = new MockMergeOperation <IColumn, Column>(); var keyOp = new MockMergeOperation <IKey, Key>(); var indexOp = new MockMergeOperation <IIndex, Index>(); results.AddTableOperation(tableOp); results.AddColumnOperation(columnOp); results.AddKeyOperation(keyOp); results.AddIndexOperation(indexOp); form.Stub(f => { var v = f.SelectedAddedTableOperations; }).Return(new List <IMergeOperation <ITable> > { tableOp }); form.Stub(f => { var v = f.SelectedRemovedTableOperations; }).Return(new List <IMergeOperation <ITable> >()); new SimpleDBMergeResultPresenter(form, panel, results); form.GetEventRaiser(f => f.ChangesAccepted += null).Raise(form, null); panel.AssertWasCalled(f => f.CloseDatabaseRefreshResultsForm(Changes.WereAccepted)); Assert.That(tableOp.OperationRun, Is.True); Assert.That(indexOp.OperationRun, Is.True); Assert.That(columnOp.OperationRun, Is.True); Assert.That(keyOp.OperationRun, Is.True); Assert.That(tableOp.SecondStepRun, Is.True); Assert.That(indexOp.SecondStepRun, Is.True); Assert.That(columnOp.SecondStepRun, Is.True); Assert.That(keyOp.SecondStepRun, Is.True); }
public void Fill(DatabaseMergeResult results, IDatabase db1, IDatabase db2) { if (InvokeRequired) { Invoke(new MethodInvoker(() => Fill(results, db1, db2))); return; } DB1 = db1; DB2 = db2; advTreeTables.BeginUpdate(); nodeNewEntities.Nodes.Clear(); nodeModifiedEntities.Nodes.Clear(); nodeRemovedEntities.Nodes.Clear(); nodeNewEntities.Checked = true; nodeModifiedEntities.Checked = true; nodeRemovedEntities.Checked = false; try { #region Database-only foreach (TableAdditionOperation addedTableOperation in results.TableOperations.Where(r => r is TableAdditionOperation)) { Node node = new Node(string.Format("{0}.{1}", addedTableOperation.Object.Schema, addedTableOperation.Object.Name)); node.Tag = addedTableOperation; node.CheckBoxVisible = true; node.Checked = false; node.ImageIndex = IMG_NEW; nodeRemovedEntities.Nodes.Add(node); } #endregion #region Model-only IList <SynchroGrid.SynchroCanvas.TableMatch> MatchesModelOnly = new List <SynchroGrid.SynchroCanvas.TableMatch>(); foreach (TableRemovalOperation removedTableOperation in results.TableOperations.Where(r => r is TableRemovalOperation)) { Node node = new Node(string.Format("{0}.{1}", removedTableOperation.Object.Schema, removedTableOperation.Object.Name)); node.Tag = removedTableOperation; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_REMOVED; nodeNewEntities.Nodes.Add(node); } #endregion #region Changes HashSet <string> changedTables = new HashSet <string>(); #region Get tables with changes foreach (var result in results.ColumnOperations) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } foreach (var result in results.IndexOperations) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } foreach (var result in results.KeyOperations) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } //foreach (var result in results.RelationshipOperations) // changedTables.Add(string.Format("{0}.{1}", result.Object.PrimaryTable.Schema, result.Object.PrimaryTable.Name)); #endregion foreach (string changedTable in changedTables) { Node node = new Node(changedTable); node.Tag = changedTable; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_CHANGED; nodeModifiedEntities.Nodes.Add(node); #region Columns foreach (ColumnAdditionOperation newColumn in results.ColumnOperations.Where(r => r is ColumnAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Remove column from database: [{0}]", newColumn.Object.Name)); columnnode.Tag = newColumn; node.Nodes.Add(columnnode); } foreach (ColumnChangeOperation changedColumn in results.ColumnOperations.Where(r => r is ColumnChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Update column in database [{0}]", changedColumn.Object.Name)); columnnode.Tag = changedColumn; node.Nodes.Add(columnnode); foreach (string d in changedColumn.Description.Split(',')) { columnnode.Nodes.Add(new Node(d)); } } foreach (ColumnRemovalOperation removedColumn in results.ColumnOperations.Where(r => r is ColumnRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Add column to database: [{0}]", removedColumn.Object.Name)); columnnode.Tag = removedColumn; node.Nodes.Add(columnnode); } #endregion #region Indexes foreach (IndexAdditionOperation newIndex in results.IndexOperations.Where(r => r is IndexAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Remove index from database: [{0}]", newIndex.Object.Name)); indexNode.Tag = newIndex; node.Nodes.Add(indexNode); } foreach (IndexChangeOperation changedIndex in results.IndexOperations.Where(r => r is IndexChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Update index in database [{0}]", changedIndex.Object.Name)); indexNode.Tag = changedIndex; node.Nodes.Add(indexNode); foreach (string d in changedIndex.Description.Split(',')) { indexNode.Nodes.Add(new Node(d)); } } foreach (IndexRemovalOperation removedIndex in results.IndexOperations.Where(r => r is IndexRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Add index to database: [{0}]", removedIndex.Object.Name)); indexNode.Tag = removedIndex; node.Nodes.Add(indexNode); } #endregion #region Keys foreach (KeyAdditionOperation newKey in results.KeyOperations.Where(r => r is KeyAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Remove key from database: [{0}]", newKey.Object.Name)); keyNode.Tag = newKey; node.Nodes.Add(keyNode); } foreach (KeyChangeOperation changedKey in results.KeyOperations.Where(r => r is KeyChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Update key in database [{0}]", changedKey.Object.Name)); keyNode.Tag = changedKey; node.Nodes.Add(keyNode); foreach (string d in changedKey.Description.Split(',')) { keyNode.Nodes.Add(new Node(d)); } } foreach (KeyRemovalOperation removedKey in results.KeyOperations.Where(r => r is KeyRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Add key to database: [{0}]", removedKey.Object.Name)); keyNode.Tag = removedKey; node.Nodes.Add(keyNode); } #endregion #region Relationships //foreach (RelationshipAdditionOperation newRelationship in results.RelationshipOperations.Where(r => r is RelationshipAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable).Distinct()) //{ // Node relationshipNode = new Node(string.Format("Remove relationship from database, with {0}: [{1}]", newRelationship.Object.ForeignTable.Name, newRelationship.Object.Name)); // relationshipNode.Tag = newRelationship; // node.Nodes.Add(relationshipNode); //} //foreach (RelationshipChangeOperation changedRelationship in results.RelationshipOperations.Where(r => r is RelationshipChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) //{ // Node relationshipNode = new Node(string.Format("Update relationship in database, with {0}: [{1}]", changedRelationship.Object.ForeignTable.Name, changedRelationship.Object.Name)); // relationshipNode.Tag = changedRelationship; // node.Nodes.Add(relationshipNode); // foreach (string d in changedRelationship.Description.Split(',')) // relationshipNode.Nodes.Add(new Node(d)); //} //foreach (RelationshipRemovalOperation removedRelationship in results.RelationshipOperations.Where(r => r is RelationshipRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) //{ // Node relationshipNode = new Node(string.Format("Add relationship to database, with {0}: [{1}]", removedRelationship.Object.ForeignTable.Name, removedRelationship.Object.Name)); // relationshipNode.Tag = removedRelationship; // node.Nodes.Add(relationshipNode); //} #endregion } #endregion nodeNewEntities.Visible = nodeNewEntities.Nodes.Count > 0; nodeModifiedEntities.Visible = nodeModifiedEntities.Nodes.Count > 0; nodeRemovedEntities.Visible = nodeRemovedEntities.Nodes.Count > 0; if (!nodeNewEntities.Visible && !nodeModifiedEntities.Visible && !nodeRemovedEntities.Visible) { nodeEmpty.Text = "The database has no changes"; nodeEmpty.Visible = true; } else { nodeEmpty.Visible = false; } } finally { advTreeTables.EndUpdate(); } }
public void SetDatabaseChanges(DatabaseMergeResult results) { var processor = new DBMergeResultProcessor(results); rtbChanges.Text = processor.GetTextResults(); }
public void Fill(DatabaseMergeResult results, IDatabase db1, IDatabase db2) { if (results == null || db1 == null || db2 == null) { throw new Exception(string.Format("Parameter is null (DatabaseChanges.Fill). Please inform Slyce of this error, including your scenario. [{0}{1}{2}]", results == null ? "results: null" : "", db1 == null ? "db1: null" : "", db2 == null ? "db2: null" : "")); } if (InvokeRequired) { Invoke(new MethodInvoker(() => Fill(results, db1, db2))); return; } DB1 = db1; DB2 = db2; advTreeTables.BeginUpdate(); nodeNewTables.Nodes.Clear(); nodeModifiedTables.Nodes.Clear(); nodeRemovedTables.Nodes.Clear(); nodeNewViews.Nodes.Clear(); nodeModifiedViews.Nodes.Clear(); nodeRemovedViews.Nodes.Clear(); nodeNewTables.Checked = true; nodeModifiedTables.Checked = true; nodeRemovedTables.Checked = false; nodeNewViews.Checked = false; nodeModifiedViews.Checked = true; nodeRemovedViews.Checked = false; try { #region Database-only Node schemaNode = null; string currentSchema = null; foreach (TableAdditionOperation addedTableOperation in results.TableOperations.Where(r => r is TableAdditionOperation).OrderBy(a => a.Object.Schema).ThenBy(a => a.Object.Name)) { if (addedTableOperation.Object.Schema != currentSchema) { currentSchema = addedTableOperation.Object.Schema; schemaNode = new Node(currentSchema) { CheckBoxVisible = true, Checked = true }; nodeNewTables.Nodes.Add(schemaNode); } Node node = new Node(addedTableOperation.Object.Name); node.Tag = addedTableOperation; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_NEW; schemaNode.Nodes.Add(node); } schemaNode = null; currentSchema = null; foreach (TableAdditionOperation addedViewOperation in results.ViewOperations.Where(r => r is TableAdditionOperation).OrderBy(a => a.Object.Schema).ThenBy(a => a.Object.Name)) { if (addedViewOperation.Object.Schema != currentSchema) { currentSchema = addedViewOperation.Object.Schema; schemaNode = new Node(currentSchema) { CheckBoxVisible = true, Checked = false }; nodeNewViews.Nodes.Add(schemaNode); } Node node = new Node(addedViewOperation.Object.Name); node.Tag = addedViewOperation; node.CheckBoxVisible = true; node.Checked = false; node.ImageIndex = IMG_NEW; schemaNode.Nodes.Add(node); } #endregion #region Model-only schemaNode = null; currentSchema = null; foreach (TableRemovalOperation removedTableOperation in results.TableOperations.Where(r => r is TableRemovalOperation).OrderBy(a => a.Object.Schema).ThenBy(a => a.Object.Name)) { if (removedTableOperation.Object.Schema != currentSchema) { currentSchema = removedTableOperation.Object.Schema; schemaNode = new Node(currentSchema) { CheckBoxVisible = true, Checked = false }; nodeRemovedTables.Nodes.Add(schemaNode); } Node node = new Node(removedTableOperation.Object.Name); node.Tag = removedTableOperation; node.CheckBoxVisible = true; node.Checked = false; node.ImageIndex = IMG_REMOVED; schemaNode.Nodes.Add(node); } schemaNode = null; currentSchema = null; foreach (TableRemovalOperation removedViewOperation in results.ViewOperations.Where(r => r is TableRemovalOperation).OrderBy(a => a.Object.Schema).ThenBy(a => a.Object.Name)) { if (removedViewOperation.Object.Schema != currentSchema) { currentSchema = removedViewOperation.Object.Schema; schemaNode = new Node(currentSchema) { CheckBoxVisible = true, Checked = false }; nodeRemovedViews.Nodes.Add(schemaNode); } Node node = new Node(removedViewOperation.Object.Name); node.Tag = removedViewOperation; node.CheckBoxVisible = true; node.Checked = false; node.ImageIndex = IMG_REMOVED; schemaNode.Nodes.Add(node); } #endregion #region Changes HashSet <string> changedTables = new HashSet <string>(); #region Get tables with changes foreach (var result in results.ColumnOperations.Where(o => o.Object != null && o.Object.Parent != null)) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } foreach (var result in results.IndexOperations.Where(o => o.Object != null && o.Object.Parent != null)) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } foreach (var result in results.KeyOperations.Where(o => o.Object != null && o.Object.Parent != null)) { changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); } foreach (var result in results.RelationshipOperations.Where(o => o.Object != null && o.Object.PrimaryTable != null)) { changedTables.Add(string.Format("{0}.{1}", result.Object.PrimaryTable.Schema, result.Object.PrimaryTable.Name)); } #endregion schemaNode = null; currentSchema = null; foreach (string changedTable in changedTables) { string schema = changedTable.Split('.')[0]; string tableName = changedTable.Split('.')[1]; if (schema != currentSchema) { currentSchema = schema; schemaNode = new Node(currentSchema) { CheckBoxVisible = true, Checked = true }; nodeModifiedTables.Nodes.Add(schemaNode); } Node node = new Node(tableName); node.Tag = changedTable; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_CHANGED; schemaNode.Nodes.Add(node); #region Columns foreach (ColumnAdditionOperation newColumn in results.ColumnOperations.Where(r => r is ColumnAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Add column to model: [{0}]", newColumn.Object.Name)); columnnode.Tag = newColumn; node.Nodes.Add(columnnode); } foreach (ColumnChangeOperation changedColumn in results.ColumnOperations.Where(r => r is ColumnChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Update column in model [{0}]", changedColumn.Object.Name)); columnnode.Tag = changedColumn; node.Nodes.Add(columnnode); foreach (string d in changedColumn.Description.Split(',')) { columnnode.Nodes.Add(new Node(d)); } } foreach (ColumnRemovalOperation removedColumn in results.ColumnOperations.Where(r => r is ColumnRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Remove column from model: [{0}]", removedColumn.Object.Name)); columnnode.Tag = removedColumn; node.Nodes.Add(columnnode); } #endregion #region Indexes foreach (IndexAdditionOperation newIndex in results.IndexOperations.Where(r => r is IndexAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Add index to model: [{0}]", newIndex.Object.Name)); indexNode.Tag = newIndex; node.Nodes.Add(indexNode); } foreach (IndexChangeOperation changedIndex in results.IndexOperations.Where(r => r is IndexChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Update index in model [{0}]", changedIndex.Object.Name)); indexNode.Tag = changedIndex; node.Nodes.Add(indexNode); foreach (string d in changedIndex.Description.Split(',')) { indexNode.Nodes.Add(new Node(d)); } } foreach (IndexRemovalOperation removedIndex in results.IndexOperations.Where(r => r is IndexRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Remove index from model: [{0}]", removedIndex.Object.Name)); indexNode.Tag = removedIndex; node.Nodes.Add(indexNode); } #endregion #region Keys foreach (KeyAdditionOperation newKey in results.KeyOperations.Where(r => r is KeyAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Add key to model: [{0}]", newKey.Object.Name)); keyNode.Tag = newKey; node.Nodes.Add(keyNode); } foreach (KeyChangeOperation changedKey in results.KeyOperations.Where(r => r is KeyChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Update key in model [{0}]", changedKey.Object.Name)); keyNode.Tag = changedKey; node.Nodes.Add(keyNode); foreach (string d in changedKey.Description.Split(',')) { keyNode.Nodes.Add(new Node(d)); } } foreach (KeyRemovalOperation removedKey in results.KeyOperations.Where(r => r is KeyRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Remove key from model: [{0}]", removedKey.Object.Name)); keyNode.Tag = removedKey; node.Nodes.Add(keyNode); } #endregion #region Relationships foreach (RelationshipAdditionOperation newRelationship in results.RelationshipOperations.Where(r => r is RelationshipAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) { Node relationshipNode = new Node(string.Format("Add relationship to model, with {0}: [{1}]", newRelationship.Object.ForeignTable.Name, newRelationship.Object.Name)); relationshipNode.Tag = newRelationship; node.Nodes.Add(relationshipNode); } foreach (RelationshipChangeOperation changedRelationship in results.RelationshipOperations.Where(r => r is RelationshipChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) { Node relationshipNode = new Node(string.Format("Update relationship in model, with {0}: [{1}]", changedRelationship.Object.ForeignTable.Name, changedRelationship.Object.Name)); relationshipNode.Tag = changedRelationship; node.Nodes.Add(relationshipNode); foreach (string d in changedRelationship.Description.Split(',')) { relationshipNode.Nodes.Add(new Node(d)); } } foreach (RelationshipRemovalOperation removedRelationship in results.RelationshipOperations.Where(r => r is RelationshipRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) { Node relationshipNode = new Node(string.Format("Remove relationship from model, with {0}: [{1}]", removedRelationship.Object.ForeignTable.Name, removedRelationship.Object.Name)); relationshipNode.Tag = removedRelationship; node.Nodes.Add(relationshipNode); } #endregion } #endregion nodeNewTables.Visible = nodeNewTables.Nodes.Count > 0; nodeModifiedTables.Visible = nodeModifiedTables.Nodes.Count > 0; nodeRemovedTables.Visible = nodeRemovedTables.Nodes.Count > 0; nodeNewViews.Visible = nodeNewViews.Nodes.Count > 0; nodeModifiedViews.Visible = nodeModifiedViews.Nodes.Count > 0; nodeRemovedViews.Visible = nodeRemovedViews.Nodes.Count > 0; if (!nodeNewTables.Visible && !nodeModifiedTables.Visible && !nodeRemovedTables.Visible && !nodeNewViews.Visible && !nodeModifiedViews.Visible && !nodeRemovedViews.Visible) { nodeEmpty.Text = "The database has no changes"; nodeEmpty.Visible = true; } else { nodeEmpty.Visible = false; } } catch (Exception ex) { throw new Exception(string.Format("Error in DatabaseChanges.Fill: {0}\n{1}", ex.Message, ex.StackTrace)); } finally { advTreeTables.EndUpdate(); } }
public override void DetachFromModel() { results = null; Detached = true; }
public DBMergeResultProcessor(DatabaseMergeResult results) { this.results = results; }
public DatabaseMergeResult MergeDatabases(IDatabase db1, IDatabase db2) { DatabaseMergeResult mergeResult = new DatabaseMergeResult(); #region Tables IEnumerable<ITable> tables1 = db1.Tables; IEnumerable<ITable> tables2 = db2.Tables; List<ITable> newTables = tables1.Compliment(tables2).ToList(); List<ITable> removedTables = tables2.Compliment(tables1).ToList(); // Check for changed tables. Func<ITable, string> sorter = n => n.Name; Table.TableComparer comparer = new Table.TableComparer(); IEnumerable<ITable> intersection1 = tables1.Intersect(tables2, comparer).OrderBy(sorter); var commonItems = intersection1.Zip(tables2.Intersect(tables1, comparer).OrderBy(sorter)); foreach (var memberPair in commonItems) if (memberPair.Key.HasChanges(memberPair.Value)) mergeResult.AddTableOperation(new TableChangeOperation(memberPair.Key, memberPair.Value)); foreach (var t in newTables) mergeResult.AddTableOperation(new TableAdditionOperation(db1, t)); foreach (var t in removedTables) mergeResult.AddTableOperation(new TableRemovalOperation(t)); TableProcessor processor = new TableProcessor(); var tableResults = processor.ProcessTables(tables1, tables2); mergeResult.CopyFrom(tableResults); #endregion #region Views IEnumerable<ITable> views1 = db1.Views; IEnumerable<ITable> views2 = db2.Views; List<ITable> newViews = views1.Compliment(views2).ToList(); List<ITable> removedViews = views2.Compliment(views1).ToList(); // Check for changed tables. IEnumerable<ITable> viewsIntersection1 = views1.Intersect(views2, comparer).OrderBy(sorter); var commonViewItems = intersection1.Zip(views2.Intersect(views1, comparer).OrderBy(sorter)); foreach (var memberPair in commonViewItems) if (memberPair.Key.HasChanges(memberPair.Value)) mergeResult.AddViewOperation(new TableChangeOperation(memberPair.Key, memberPair.Value)); foreach (var t in newViews) mergeResult.AddViewOperation(new TableAdditionOperation(db1, t)); foreach (var t in removedViews) mergeResult.AddViewOperation(new TableRemovalOperation(t)); TableProcessor viewProcessor = new TableProcessor(); var viewResults = processor.ProcessTables(views1, views2); mergeResult.CopyFrom(viewResults); #endregion return mergeResult; }
public void Fill(DatabaseMergeResult results, IDatabase db1, IDatabase db2) { databaseChanges1.Fill(results, db1, db2); }
public void Fill(DatabaseMergeResult results, IDatabase db1, IDatabase db2) { if (InvokeRequired) { Invoke(new MethodInvoker(() => Fill(results, db1, db2))); return; } DB1 = db1; DB2 = db2; advTreeTables.BeginUpdate(); nodeNewEntities.Nodes.Clear(); nodeModifiedEntities.Nodes.Clear(); nodeRemovedEntities.Nodes.Clear(); nodeNewEntities.Checked = true; nodeModifiedEntities.Checked = true; nodeRemovedEntities.Checked = false; try { #region Database-only foreach (TableAdditionOperation addedTableOperation in results.TableOperations.Where(r => r is TableAdditionOperation)) { Node node = new Node(string.Format("{0}.{1}", addedTableOperation.Object.Schema, addedTableOperation.Object.Name)); node.Tag = addedTableOperation; node.CheckBoxVisible = true; node.Checked = false; node.ImageIndex = IMG_NEW; nodeRemovedEntities.Nodes.Add(node); } #endregion #region Model-only IList<SynchroGrid.SynchroCanvas.TableMatch> MatchesModelOnly = new List<SynchroGrid.SynchroCanvas.TableMatch>(); foreach (TableRemovalOperation removedTableOperation in results.TableOperations.Where(r => r is TableRemovalOperation)) { Node node = new Node(string.Format("{0}.{1}", removedTableOperation.Object.Schema, removedTableOperation.Object.Name)); node.Tag = removedTableOperation; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_REMOVED; nodeNewEntities.Nodes.Add(node); } #endregion #region Changes HashSet<string> changedTables = new HashSet<string>(); #region Get tables with changes foreach (var result in results.ColumnOperations) changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); foreach (var result in results.IndexOperations) changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); foreach (var result in results.KeyOperations) changedTables.Add(string.Format("{0}.{1}", result.Object.Parent.Schema, result.Object.Parent.Name)); //foreach (var result in results.RelationshipOperations) // changedTables.Add(string.Format("{0}.{1}", result.Object.PrimaryTable.Schema, result.Object.PrimaryTable.Name)); #endregion foreach (string changedTable in changedTables) { Node node = new Node(changedTable); node.Tag = changedTable; node.CheckBoxVisible = true; node.Checked = true; node.ImageIndex = IMG_CHANGED; nodeModifiedEntities.Nodes.Add(node); #region Columns foreach (ColumnAdditionOperation newColumn in results.ColumnOperations.Where(r => r is ColumnAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Remove column from database: [{0}]", newColumn.Object.Name)); columnnode.Tag = newColumn; node.Nodes.Add(columnnode); } foreach (ColumnChangeOperation changedColumn in results.ColumnOperations.Where(r => r is ColumnChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Update column in database [{0}]", changedColumn.Object.Name)); columnnode.Tag = changedColumn; node.Nodes.Add(columnnode); foreach (string d in changedColumn.Description.Split(',')) columnnode.Nodes.Add(new Node(d)); } foreach (ColumnRemovalOperation removedColumn in results.ColumnOperations.Where(r => r is ColumnRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node columnnode = new Node(string.Format("Add column to database: [{0}]", removedColumn.Object.Name)); columnnode.Tag = removedColumn; node.Nodes.Add(columnnode); } #endregion #region Indexes foreach (IndexAdditionOperation newIndex in results.IndexOperations.Where(r => r is IndexAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Remove index from database: [{0}]", newIndex.Object.Name)); indexNode.Tag = newIndex; node.Nodes.Add(indexNode); } foreach (IndexChangeOperation changedIndex in results.IndexOperations.Where(r => r is IndexChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Update index in database [{0}]", changedIndex.Object.Name)); indexNode.Tag = changedIndex; node.Nodes.Add(indexNode); foreach (string d in changedIndex.Description.Split(',')) indexNode.Nodes.Add(new Node(d)); } foreach (IndexRemovalOperation removedIndex in results.IndexOperations.Where(r => r is IndexRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node indexNode = new Node(string.Format("Add index to database: [{0}]", removedIndex.Object.Name)); indexNode.Tag = removedIndex; node.Nodes.Add(indexNode); } #endregion #region Keys foreach (KeyAdditionOperation newKey in results.KeyOperations.Where(r => r is KeyAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Remove key from database: [{0}]", newKey.Object.Name)); keyNode.Tag = newKey; node.Nodes.Add(keyNode); } foreach (KeyChangeOperation changedKey in results.KeyOperations.Where(r => r is KeyChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Update key in database [{0}]", changedKey.Object.Name)); keyNode.Tag = changedKey; node.Nodes.Add(keyNode); foreach (string d in changedKey.Description.Split(',')) keyNode.Nodes.Add(new Node(d)); } foreach (KeyRemovalOperation removedKey in results.KeyOperations.Where(r => r is KeyRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.Parent.Schema, c.Object.Parent.Name) == changedTable)) { Node keyNode = new Node(string.Format("Add key to database: [{0}]", removedKey.Object.Name)); keyNode.Tag = removedKey; node.Nodes.Add(keyNode); } #endregion #region Relationships //foreach (RelationshipAdditionOperation newRelationship in results.RelationshipOperations.Where(r => r is RelationshipAdditionOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable).Distinct()) //{ // Node relationshipNode = new Node(string.Format("Remove relationship from database, with {0}: [{1}]", newRelationship.Object.ForeignTable.Name, newRelationship.Object.Name)); // relationshipNode.Tag = newRelationship; // node.Nodes.Add(relationshipNode); //} //foreach (RelationshipChangeOperation changedRelationship in results.RelationshipOperations.Where(r => r is RelationshipChangeOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) //{ // Node relationshipNode = new Node(string.Format("Update relationship in database, with {0}: [{1}]", changedRelationship.Object.ForeignTable.Name, changedRelationship.Object.Name)); // relationshipNode.Tag = changedRelationship; // node.Nodes.Add(relationshipNode); // foreach (string d in changedRelationship.Description.Split(',')) // relationshipNode.Nodes.Add(new Node(d)); //} //foreach (RelationshipRemovalOperation removedRelationship in results.RelationshipOperations.Where(r => r is RelationshipRemovalOperation).Where(c => string.Format("{0}.{1}", c.Object.PrimaryTable.Schema, c.Object.PrimaryTable.Name) == changedTable)) //{ // Node relationshipNode = new Node(string.Format("Add relationship to database, with {0}: [{1}]", removedRelationship.Object.ForeignTable.Name, removedRelationship.Object.Name)); // relationshipNode.Tag = removedRelationship; // node.Nodes.Add(relationshipNode); //} #endregion } #endregion nodeNewEntities.Visible = nodeNewEntities.Nodes.Count > 0; nodeModifiedEntities.Visible = nodeModifiedEntities.Nodes.Count > 0; nodeRemovedEntities.Visible = nodeRemovedEntities.Nodes.Count > 0; if (!nodeNewEntities.Visible && !nodeModifiedEntities.Visible && !nodeRemovedEntities.Visible) { nodeEmpty.Text = "The database has no changes"; nodeEmpty.Visible = true; } else nodeEmpty.Visible = false; } finally { advTreeTables.EndUpdate(); } }
public void FillChangedTables( IList<TableMatch> matches, DatabaseMergeResult results) { Matches.Clear(); Matches = matches; TableRows.Clear(); foreach (TableMatch match in Matches) { #region Columns IEnumerable<IColumn> removedColumns = results.ColumnOperations.Where(r => r is ColumnRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); IEnumerable<IColumn> addedColumns = results.ColumnOperations.Where(r => r is ColumnAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); IEnumerable<IColumn> changedColumns = results.ColumnOperations.Where(r => r is ColumnChangeOperation).Select(r => r.Object); List<ColumnMatch> columnMatches = new List<ColumnMatch>(); foreach (var col in removedColumns) columnMatches.Add(new ColumnMatch(null, col)); foreach (var col in addedColumns) columnMatches.Add(new ColumnMatch(col, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Keys IEnumerable<IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); IEnumerable<IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); IEnumerable<IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List<KeyMatch> keyMatches = new List<KeyMatch>(); foreach (var key in removedKeys) keyMatches.Add(new KeyMatch(null, key)); foreach (var key in addedKeys) keyMatches.Add(new KeyMatch(key, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Indexes //IEnumerable<IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); //IEnumerable<IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); //IEnumerable<IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List<IndexMatch> indexMatches = new List<IndexMatch>(); //foreach (var key in removedKeys) // keyMatches.Add(new KeyMatch(null, key)); //foreach (var key in addedKeys) // keyMatches.Add(new KeyMatch(key, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Relationships //IEnumerable<IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); //IEnumerable<IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); //IEnumerable<IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List<RelationshipMatch> relationshipMatches = new List<RelationshipMatch>(); //foreach (var key in removedKeys) // keyMatches.Add(new KeyMatch(null, key)); //foreach (var key in addedKeys) // keyMatches.Add(new KeyMatch(key, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion TableRows.Add(new TableRow(match.ModelTable, match.DatabaseTable, this.Font, columnMatches, keyMatches, indexMatches, relationshipMatches)); } //TableRows[2].TableExpanded = true; }
public void FillChangedTables( IList <TableMatch> matches, DatabaseMergeResult results) { Matches.Clear(); Matches = matches; TableRows.Clear(); foreach (TableMatch match in Matches) { #region Columns IEnumerable <IColumn> removedColumns = results.ColumnOperations.Where(r => r is ColumnRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); IEnumerable <IColumn> addedColumns = results.ColumnOperations.Where(r => r is ColumnAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); IEnumerable <IColumn> changedColumns = results.ColumnOperations.Where(r => r is ColumnChangeOperation).Select(r => r.Object); List <ColumnMatch> columnMatches = new List <ColumnMatch>(); foreach (var col in removedColumns) { columnMatches.Add(new ColumnMatch(null, col)); } foreach (var col in addedColumns) { columnMatches.Add(new ColumnMatch(col, null)); } //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Keys IEnumerable <IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); IEnumerable <IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); IEnumerable <IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List <KeyMatch> keyMatches = new List <KeyMatch>(); foreach (var key in removedKeys) { keyMatches.Add(new KeyMatch(null, key)); } foreach (var key in addedKeys) { keyMatches.Add(new KeyMatch(key, null)); } //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Indexes //IEnumerable<IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); //IEnumerable<IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); //IEnumerable<IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List <IndexMatch> indexMatches = new List <IndexMatch>(); //foreach (var key in removedKeys) // keyMatches.Add(new KeyMatch(null, key)); //foreach (var key in addedKeys) // keyMatches.Add(new KeyMatch(key, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion #region Relationships //IEnumerable<IKey> removedKeys = results.KeyOperations.Where(r => r is KeyRemovalOperation && r.Object.Parent == match.DatabaseTable).Select(r => r.Object); //IEnumerable<IKey> addedKeys = results.KeyOperations.Where(r => r is KeyAdditionOperation && r.Object.Parent == match.ModelTable).Select(r => r.Object); //IEnumerable<IKey> changedKeys = results.KeyOperations.Where(r => r is KeyChangeOperation).Select(r => r.Object); List <RelationshipMatch> relationshipMatches = new List <RelationshipMatch>(); //foreach (var key in removedKeys) // keyMatches.Add(new KeyMatch(null, key)); //foreach (var key in addedKeys) // keyMatches.Add(new KeyMatch(key, null)); //foreach (var col in changedColumns) // columnMatches.Add(new ColumnMatch(col, null)); #endregion TableRows.Add(new TableRow(match.ModelTable, match.DatabaseTable, this.Font, columnMatches, keyMatches, indexMatches, relationshipMatches)); } //TableRows[2].TableExpanded = true; }