4 votos

ArcObjects IConflictsWindow3 no ver la versión de la reconciliación de los conflictos

Estamos trabajando en una conciliar y post add-in para uno de nuestros departamentos. Soy capaz de completar con éxito la tarea si no hay conflictos, o si puedo especificar qué versión de 'gana'. Nos gustaría utilizar el integrado de ArcMap funcionalidad para el conflicto de la pantalla y la resolución.

Por desgracia, cuando se trata de mostrar el conflicto de la ventana, estoy teniendo problemas. Primero de todo, el conflicto de la ventana no se especifica que no hay ningún conflicto de clases aunque la IVersionEdit4 objeto especifica que hay y conciliar el resultado es "verdadero". En segundo lugar, si trato de mostrar el conflicto de la ventana de todos modos, abre la ventana y ArcMap se bloquea, incluso si yo rodear el código en un bloque try.

Estoy abierto a sugerencias. No estoy particularmente interesado en la búsqueda manual de las fuentes de conflicto cuando la funcionalidad está ahí para completar la tarea en ArcMap de forma nativa y el código se expone en ArcObjects para realizar la tarea.

Me estoy perdiendo algo? Necesito alguna manera de asignar la clase que el conflicto es a la ventana?

Aquí está el código en cuestión:

    bool ReconcileToDefault(Version ToReconcile, out bool? hadConflicts)
    {
        ChangeDataSourceToDefault(ToReconcile); //changes datasources in map document to default version to prevent lock issues
        hadConflicts = null;
        IVersionedWorkspace wkspc = (IVersionedWorkspace)DBConnect.ConnectToDB("sde.DEFAULT", true);
        if (wkspc == null) return false;
        IVersion Reconcile = wkspc.FindVersion(ToReconcile.name);
        //EventListener evtListener = new EventListener(Reconcile);
        IMultiuserWorkspaceEdit muWorkspaceEdit = (IMultiuserWorkspaceEdit)Reconcile;
        IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)Reconcile;
        IVersionEdit4 versionEdit = (IVersionEdit4)muWorkspaceEdit;
        muWorkspaceEdit.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
        workspaceEdit.StartEditOperation();
        //Open the conflict resolution window. (ArcMap bombs out here, so I'm trying a different way)
        //if (cWin == null)
        //{
        //    IEditor editor = (IEditor)ArcMap.Application.FindExtensionByCLSID(new UID() { Value = "esriEditor.Editor" });
        //    cWin = (IConflictsWindow3)editor.FindExtension(new UID() { Value = "esriEditor.ConflictsWindow" });
        //    cWin.Reset();
        //    cWin.Visible = true;
        //}
        hadConflicts = versionEdit.Reconcile4("sde.DEFAULT", false, false, false, true); //I set acquire locks to true if I'm actually posting.
        if (hadConflicts == true)
        {
            versionEdit.ConflictClasses.Reset();
            var cl = ConflictResolutionDialog.CurrentClass; //variable is null with current database state
            IConflictClass first = versionEdit.ConflictClasses.Next(); //variable is a valid IConflictClass with current database state
            //MessageBox.Show(ConflictResolutionDialog.HasConflicts().ToString()); //displays false
            //MessageBox.Show(String.Format("Had {0} Conflicts.",ConflictResolutionDialog.ClassCount)); //conflict count = 0
            //ConflictResolutionDialog.Visible = true; //causes arcmap to crash
        }
        //versionEdit.Post("sde.DEFAULT"); //works just fine
        workspaceEdit.StopEditOperation();
        workspaceEdit.StopEditing(false);//generally set this to true if I post
        return true;
    }

Gracias por su atención,

0voto

FlySwat Puntos 61945

Recuerdo que en la API pública, los Conflictos de la Ventana está ligado directamente al Editor de ArcMap (internamente, puede inicializar con stateids que en mi humilde opinión es órdenes de magnitud más útil). En su caso, que se burlen de la reconciliación fase de manera que se hace en la GeoDatabase de nivel en lugar de que el Editor de ArcMap nivel de la Extensión. Esto hace que el conflicto ventana a estar fuera de control - se pregunta el Editor de la Extensión de su área de trabajo y su reconciliación del estado que no han cambiado - la versión que ha cambiado es el que va conectado al exterior del Editor de Contexto.

La solución es el uso de los métodos en el Editor de lugar. Eso significa que en lugar de llamar StartEditing en la GeoDatabase, llame al Editor::StartEditing(espacio de trabajo) método.

Además, muestran los Conflictos de la Ventana fuera de la operación de edición - no tiene sentido para mostrar los conflictos de un "intermedio" del estado (filas aún se pueden manipular en la transacción por otros oyentes).

El ConflictsWindow debería funcionar bien entonces.

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