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,