void InitTables() { myDS = new DataSet(); myDS.EnforceConstraints = false; string columnlist = QueryCreator.SortedColumnNameList(SourceTable); Added = Conn.CreateTableByName(tablename, columnlist); Added.TableName = "added"; Added.Namespace = SourceTable.Namespace; myDS.Tables.Add(Added); DataAccess.SetTableForReading(Added, tablename); CopyKeyWhenBlank(SourceTable, Added); ToAdd = Conn.CreateTableByName(tablename, columnlist); ToAdd.TableName = "toadd"; myDS.Tables.Add(ToAdd); DataAccess.SetTableForReading(ToAdd, tablename); CopyKeyWhenBlank(SourceTable, ToAdd); //Riempie la Table delle righe "ToAdd" prendendole dal DB. Questa tabella // contiene anche righe già "added" in memoria, che vanno quindi escluse. //Inoltre va integrata con righe che erano "added" e sono state rimosse // in memoria DataAccess.RUN_SELECT_INTO_TABLE(Conn, ToAdd, sorting, filterSQL, null, true); //Riempie la Table delle righe "Added". Questa contiene anche righe che sono // state rimosse in memoria, e quindi vanno rimosse (e integrate a "ToAdd") QueryCreator.MergeDataTable(Added, SourceTable); //Per tutte le righe rimosse in memoria (che rispettano il filtro): le toglie da // Added e le mette in ToAdd. string tomovefilter = GetData.MergeFilters(notentitychildfilter, filter); DataRow[] RowsToMove = Added.Select(tomovefilter); foreach (DataRow ToMove in RowsToMove) { string verifyexistentfilter = QueryCreator.WHERE_KEY_CLAUSE(ToMove, DataRowVersion.Default, false); //Just for sure I remove from ToAdd those rows I'm going to add to it! DataRow[] ToRemoveFromToAdd = ToAdd.Select(verifyexistentfilter); foreach (DataRow ToRemFromToAdd in ToRemoveFromToAdd) { ToRemFromToAdd.Delete(); ToRemFromToAdd.AcceptChanges(); } //Adds the row to ToAdd AddRowToTable(ToAdd, ToMove); //Remove the row from Added ToMove.Delete(); if (ToMove.RowState != DataRowState.Detached) { ToMove.AcceptChanges(); } } //Per tutte le righe rimosse in memoria rimanenti (ossia che NON rispettano // il filtro) : le rimuovo da Added DataRow[] ToRemoveFromAdded = Added.Select(notentitychildfilter); foreach (DataRow ToRemFromAdded in ToRemoveFromAdded) { ToRemFromAdded.Delete(); if (ToRemFromAdded.RowState != DataRowState.Detached) { ToRemFromAdded.AcceptChanges(); } } //Per tutte le righe rimaste in Added: le rimuove da ToAdd DataRow[] ToRemoveFromToAdd2 = Added.Select(); foreach (DataRow ToRemFromToAdd in ToRemoveFromToAdd2) { string ToRemKeyFilter = QueryCreator.WHERE_KEY_CLAUSE(ToRemFromToAdd, DataRowVersion.Default, false); DataRow[] ToRemove = ToAdd.Select(ToRemKeyFilter); foreach (DataRow ToRem in ToRemove) { ToRem.Delete(); if (ToRem.RowState != DataRowState.Detached) { ToRem.AcceptChanges(); } } } MetaData M = linked.Dispatcher.Get(tablename); M.DescribeColumns(ToAdd, listingtype); M.DescribeColumns(Added, listingtype); HT["Added"] = Added; HT["ToAdd"] = ToAdd; SetDataTable(ToAdd, GridToAdd); SetDataTable(Added, GridAdded); }