Exemple #1
0
        protected override void Page_Command(Object sender, CommandEventArgs e)
        {
            try
            {
                DataTable dtFields = ViewState["dtFields"] as DataTable;
                if (e.CommandName == "Layout.Edit")
                {
                    if (ctlNewRecord != null)
                    {
                        ctlNewRecord.Clear();
                        int      nFieldIndex = Sql.ToInteger(e.CommandArgument);
                        DataView vwFields    = new DataView(dtFields);
                        vwFields.RowFilter = "DELETED = 0 and " + LayoutIndexName() + " = " + nFieldIndex.ToString();
                        if (vwFields.Count == 1)
                        {
                            foreach (DataRowView row in vwFields)
                            {
                                ctlNewRecord.FIELD_ID          = Sql.ToGuid(row["ID"]);
                                ctlNewRecord.FIELD_INDEX       = Sql.ToInteger(row[LayoutIndexName()]);
                                ctlNewRecord.FIELD_TYPE        = Sql.ToString(row[LayoutTypeName()]);
                                ctlNewRecord.DATA_LABEL        = Sql.ToString(row["DATA_LABEL"]);
                                ctlNewRecord.DATA_FIELD        = Sql.ToString(row["DATA_FIELD"]);
                                ctlNewRecord.DISPLAY_FIELD     = Sql.ToString(row["DISPLAY_FIELD"]);
                                ctlNewRecord.LIST_NAME         = Sql.ToString(row["LIST_NAME"]);
                                ctlNewRecord.DATA_REQUIRED     = Sql.ToBoolean(row["DATA_REQUIRED"]);
                                ctlNewRecord.UI_REQUIRED       = Sql.ToBoolean(row["UI_REQUIRED"]);
                                ctlNewRecord.ONCLICK_SCRIPT    = Sql.ToString(row["ONCLICK_SCRIPT"]);
                                ctlNewRecord.FORMAT_SCRIPT     = Sql.ToString(row["FORMAT_SCRIPT"]);
                                ctlNewRecord.FORMAT_TAB_INDEX  = Sql.ToInteger(row["FORMAT_TAB_INDEX"]);
                                ctlNewRecord.FORMAT_MAX_LENGTH = Sql.ToInteger(row["FORMAT_MAX_LENGTH"]);
                                ctlNewRecord.FORMAT_SIZE       = Sql.ToInteger(row["FORMAT_SIZE"]);
                                ctlNewRecord.FORMAT_ROWS       = Sql.ToInteger(row["FORMAT_ROWS"]);
                                ctlNewRecord.FORMAT_COLUMNS    = Sql.ToInteger(row["FORMAT_COLUMNS"]);
                                ctlNewRecord.COLSPAN           = Sql.ToInteger(row["COLSPAN"]);
                                ctlNewRecord.ROWSPAN           = Sql.ToInteger(row["ROWSPAN"]);
                                ctlNewRecord.Visible           = true;
                                break;
                            }
                        }
                    }
                }
                else if (e.CommandName == "NewRecord.Save")
                {
                    if (ctlNewRecord != null)
                    {
                        DataView vwFields = new DataView(dtFields);
                        vwFields.RowFilter = "DELETED = 0 and ID = '" + ctlNewRecord.FIELD_ID + "'";
                        if (vwFields.Count == 1)
                        {
                            // 01/09/2006 Paul.  Make sure to use ToDBString to convert empty stings to NULL.
                            foreach (DataRowView row in vwFields)
                            {
                                row[LayoutTypeName()] = Sql.ToDBString(ctlNewRecord.FIELD_TYPE);
                                row["DATA_LABEL"]     = Sql.ToDBString(ctlNewRecord.DATA_LABEL);
                                row["DATA_FIELD"]     = Sql.ToDBString(ctlNewRecord.DATA_FIELD);
                                row["DISPLAY_FIELD"]  = Sql.ToDBString(ctlNewRecord.DISPLAY_FIELD);
                                row["LIST_NAME"]      = Sql.ToDBString(ctlNewRecord.LIST_NAME);
                                // 01/20/2006 Paul.  Need to duplicate the the LIST_NAME in the CACHE_NAME as the dynamic code uses CACHE_NAME.
                                row["CACHE_NAME"]        = Sql.ToDBString(ctlNewRecord.LIST_NAME);
                                row["DATA_REQUIRED"]     = Sql.ToDBBoolean(ctlNewRecord.DATA_REQUIRED);
                                row["UI_REQUIRED"]       = Sql.ToDBBoolean(ctlNewRecord.UI_REQUIRED);
                                row["ONCLICK_SCRIPT"]    = Sql.ToDBString(ctlNewRecord.ONCLICK_SCRIPT);
                                row["FORMAT_SCRIPT"]     = Sql.ToDBString(ctlNewRecord.FORMAT_SCRIPT);
                                row["FORMAT_TAB_INDEX"]  = Sql.ToDBInteger(ctlNewRecord.FORMAT_TAB_INDEX);
                                row["FORMAT_MAX_LENGTH"] = Sql.ToDBInteger(ctlNewRecord.FORMAT_MAX_LENGTH);
                                row["FORMAT_SIZE"]       = Sql.ToDBInteger(ctlNewRecord.FORMAT_SIZE);
                                row["FORMAT_ROWS"]       = Sql.ToDBInteger(ctlNewRecord.FORMAT_ROWS);
                                row["FORMAT_COLUMNS"]    = Sql.ToDBInteger(ctlNewRecord.FORMAT_COLUMNS);
                                row["COLSPAN"]           = Sql.ToDBInteger(ctlNewRecord.COLSPAN);
                                row["ROWSPAN"]           = Sql.ToDBInteger(ctlNewRecord.ROWSPAN);
                                break;
                            }
                        }
                        else
                        {
                            // 01/08/2006 Paul.  If not found, then insert a new field.
                            if (ctlNewRecord.FIELD_INDEX == -1)
                            {
                                ctlNewRecord.FIELD_INDEX = DynamicTableNewFieldIndex(dtFields);
                            }
                            else
                            {
                                // Make room for the new record.
                                DynamicTableInsert(dtFields, ctlNewRecord.FIELD_INDEX);
                            }
                            // 01/09/2006 Paul.  Make sure to use ToDBString to convert empty stings to NULL.
                            DataRow row = dtFields.NewRow();
                            dtFields.Rows.Add(row);
                            row["ID"]              = Guid.NewGuid();
                            row["DELETED"]         = 0;
                            row["EDIT_NAME"]       = Sql.ToDBString(ViewState["LAYOUT_VIEW_NAME"]);
                            row[LayoutIndexName()] = Sql.ToDBInteger(ctlNewRecord.FIELD_INDEX);
                            row[LayoutTypeName()]  = Sql.ToDBString(ctlNewRecord.FIELD_TYPE);
                            row["DATA_LABEL"]      = Sql.ToDBString(ctlNewRecord.DATA_LABEL);
                            row["DATA_FIELD"]      = Sql.ToDBString(ctlNewRecord.DATA_FIELD);
                            row["DISPLAY_FIELD"]   = Sql.ToDBString(ctlNewRecord.DISPLAY_FIELD);
                            row["LIST_NAME"]       = Sql.ToDBString(ctlNewRecord.LIST_NAME);
                            // 01/20/2006 Paul.  Need to duplicate the the LIST_NAME in the CACHE_NAME as the dynamic code uses CACHE_NAME.
                            row["CACHE_NAME"]        = Sql.ToDBString(ctlNewRecord.LIST_NAME);
                            row["DATA_REQUIRED"]     = Sql.ToDBBoolean(ctlNewRecord.DATA_REQUIRED);
                            row["UI_REQUIRED"]       = Sql.ToDBBoolean(ctlNewRecord.UI_REQUIRED);
                            row["ONCLICK_SCRIPT"]    = Sql.ToDBString(ctlNewRecord.ONCLICK_SCRIPT);
                            row["FORMAT_SCRIPT"]     = Sql.ToDBString(ctlNewRecord.FORMAT_SCRIPT);
                            row["FORMAT_TAB_INDEX"]  = Sql.ToDBInteger(ctlNewRecord.FORMAT_TAB_INDEX);
                            row["FORMAT_MAX_LENGTH"] = Sql.ToDBInteger(ctlNewRecord.FORMAT_MAX_LENGTH);
                            row["FORMAT_SIZE"]       = Sql.ToDBInteger(ctlNewRecord.FORMAT_SIZE);
                            row["FORMAT_ROWS"]       = Sql.ToDBInteger(ctlNewRecord.FORMAT_ROWS);
                            row["FORMAT_COLUMNS"]    = Sql.ToDBInteger(ctlNewRecord.FORMAT_COLUMNS);
                            row["COLSPAN"]           = Sql.ToDBInteger(ctlNewRecord.COLSPAN);
                            row["ROWSPAN"]           = Sql.ToDBInteger(ctlNewRecord.ROWSPAN);
                        }
                        ViewState["dtFields"] = dtFields;
                        LayoutView_Bind(dtFields);
                        if (ctlNewRecord != null)
                        {
                            ctlNewRecord.Clear();
                        }
                    }
                }
                else if (e.CommandName == "Defaults")
                {
                    DbProviderFactory dbf = DbProviderFactories.GetFactory();
                    using (IDbConnection con = dbf.CreateConnection())
                    {
                        con.Open();
                        string sSQL;
                        sSQL = "select *                         " + ControlChars.CrLf
                               + "  from vwEDITVIEWS_FIELDS        " + ControlChars.CrLf
                               + " where EDIT_NAME = @EDIT_NAME    " + ControlChars.CrLf
                               + "   and DEFAULT_VIEW = 1          " + ControlChars.CrLf
                               + " order by " + LayoutIndexName() + ControlChars.CrLf;
                        using (IDbCommand cmd = con.CreateCommand())
                        {
                            cmd.CommandText = sSQL;
                            Sql.AddParameter(cmd, "@EDIT_NAME", Sql.ToString(ViewState["LAYOUT_VIEW_NAME"]));

                            using (DbDataAdapter da = dbf.CreateDataAdapter())
                            {
                                ((IDbDataAdapter)da).SelectCommand = cmd;
                                //dtFields = new DataTable();
                                // 01/09/2006 Paul.  Mark existing records for deletion.
                                // This is so that the save operation can update only records that have changed.
                                foreach (DataRow row in dtFields.Rows)
                                {
                                    row["DELETED"] = 1;
                                }
                                da.Fill(dtFields);
                                // 01/09/2006 Paul.  We need to change the IDs for two reasons, one is to prevent updating the Default Values,
                                // the second reason is that we need the row to get a Modified state.  Otherwise the update loop will skip it.
                                foreach (DataRow row in dtFields.Rows)
                                {
                                    if (Sql.ToInteger(row["DELETED"]) == 0)
                                    {
                                        row["ID"] = Guid.NewGuid();
                                    }
                                }
                            }
                        }
                    }
                    ViewState["dtFields"] = dtFields;
                    LayoutView_Bind(dtFields);

                    if (ctlNewRecord != null)
                    {
                        ctlNewRecord.Clear();
                    }
                }
                else
                {
                    base.Page_Command(sender, e);
                }
            }
            catch (Exception ex)
            {
                SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex.Message);
                ctlLayoutButtons.ErrorText = ex.Message;
            }
        }