7 votos

Problemas al intentar deshacer edición operaciones en ArcGIS

Estoy tratando de manera programática de stop/anular/deshacer una operación de edición en el interior de una de ArcSDE medio ambiente. Mi entorno es actualmente Oracle, ArcSDE 9.3.1 y en nuestro código personalizado (I heredó una gran fea parte de un sistema) a los desarrolladores hacer uso StartEditing/StartEditOperation y StopEditing/StopEditOperation de flujo de trabajo, pero SÓLO el uso de IWorkspaceEdit interfaz y no Imultiversion de la interfaz.

Por desgracia, fuera de la base de datos NO versionados y todas las ediciones hecho con ArcMap se realiza mediante eliminando la opción de Deshacer/Rehacer - por lo tanto, todos mis deshacer falla (a Excepción de COM).

Estoy tratando de capturar a un OnDeleteEvent y dentro de el, puedo comprobar si una determinada condición, y entonces yo llamo AbortOperation, pero la operación no se anula. Necesito parar toda la sesión de edición y preguntar para no guardar "rollback" mis ediciones. Este consistentes con ESRI docs.

Mi conjetura es que aquí, la elimine ya pasó y entregado a la base de datos? Si sí, ¿qué es una estrategia para no permitir que esta edición a suceder? Hay algunos escenarios que necesito para cancelar la operación de edición. Sé que IEditEvents2 tiene un BeforeStopOperation evento, pero ESRI explícitamente nos dice que no llame AbortOperation dentro de estos eventos.

También hay otros problemas con esta configuración: me echa para todas las ediciones en un stopEditOperation y generar algunas de las notificaciones con ella. Todas las ediciones vienen a mí como vacío. Esto podría tener algo que hacer con él?

Por favor, ayuda?

Gracias chicos!

Ejemplo de código (onDeleteEvent):

    void events_OnDelete(IObject obj)
    {
        ITable table = null;
        IDataset dataset = obj.Table as IDataset;

        IFeatureWorkspace workspace = dataset.Workspace as IFeatureWorkspace;
        IWorkspaceEdit edit = workspace as IWorkspaceEdit;

        edit.EnableUndoRedo();

        IQueryFilter filter = new QueryFilterClass();

        try
        {
            foreach (string s in VariousTables())
            {
                table = workspace.OpenTable(s);

                if (s.Contains("vertex"))
                    filter.WhereClause = "clause A";
                else
                    filter.WhereClause = "clause B";

                if (table.RowCount(filter) > 0)
                {
                    edit.AbortEditOperation(); --> this still deletes the point
                    // edit.UndoEditOperation() --> this breaks, as the workspace does not support Undos
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("ErroR",ex);
        }
    }

4voto

Jonathan Puntos 197

De acuerdo a la documentación aquí, usted necesita para criar a un error en lugar de utilizar AbortEditOperation cuando desee cancelar una edición en OnDelete.

Si usted está utilizando el OnCreate, OnDelete o OnChange métodos en un extensión de la clase para validar editar operaciones, no debe llamar a AbortEditOperation en el área de trabajo si la lógica indica que la edición la operación no es válida. En su lugar, aumentar un error que se propagan a la aplicación que está realizando la editar en la clase.

1voto

FlySwat Puntos 61945

Un par de notas:

Tome la línea siguiente

EnableUndoRedo

No hace nada en este punto, ya que sólo se utiliza durante la implementación interna de startediting para averiguar cómo debe generar su propio estado interno del árbol durante el versionado de edición.

Usted está utilizando no versionados (aka corto transacción) de edición. Tirar E_FAIL como Todd sugirió trabajo, sin embargo, yo tendría cuidado con las llamadas de Búsqueda en la misma tabla que desea potencialmente abortar. Por qué? Ciertas operaciones (como la Búsqueda) tiene que vaciar antes de que se le puede dar resultados precisos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X