예제 #1
0
    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);
    }