5 votos

Especificar una ubicación de inicio con IgxDialog

Me gustaría saber cuál es la forma más sencilla para establecer el punto de partida de un diálogo datos a un IWorkspace?

Mi problema es que, básicamente, no quiero una conexión (.sde archivo) para los usuarios. Quiero establecer el punto de partida para un área de trabajo conectados a través de IPropertySet. Es posible?

Esto está relacionado con: la Fuerza de un nuevo AddDataDialog para abrir en un directorio definido por el camino , pero no ayuda.

EDITAR:

siguiente Kirk sugerencia, he aquí un fragmento de código. Esto no funciona.

    public static IDataset OpenDatasetDialog(IWorkspace workspace,int handle)
    {
        var workspaceName = (IWorkspaceName)((IDataset)workspace).FullName);
        var gxDatabase = new GxdatabaseClass();
        gxDatabase.WorkspaceName = workspaceName;

        // we need to set a different variable as .NET runtime does not allow ref parameters with casts
        object gxObj = (object)gxDatabase;

        IGxDialog openDialog = new GxDialogClass();
        openDialog.RememberLocation = false;
        openDialog.set_StartingLocation(ref gxObj);
        var filterColletion = (IGxObjectFilterCollection)openDialog;
        filterColletion.AddFilter(new GxFilterTablesAndFeatureClassesClass(), true);
        openDialog.AllowMultiSelect = false;
        IEnumGxObject datasets = null;
        IDataset dataset = null;

        if (openDialog.DoModalOpen(0, out datasets) && datasets != null)
        {
            IGxObject gxObject = datasets.Next();
            if (gxObject is IGxDataset)
            {
                IGxDataset gxDataset = (IGxDataset)gxObject;
                dataset = gxDataset.Dataset;
            }
            else
                throw new ArgumentException();
        }
        openDialog.InternalCatalog.Close();
        return dataset;
    }

7voto

saint_groceon Puntos 2696

El doc para IGxDialog.StartingLocation dice:

El cuadro de diálogo ubicación de inicio. Esto puede ser un IGxObject o un texto de cadena que contiene el nombre completo de un objeto.

Yo interpretaría que significa que usted puede crear un IWorkspaceName el uso de su propertyset, a continuación, crear una nueva GxDatabase objeto y establecer IGxDatabase.Workspacename a la workspacename, y, finalmente, asignar el IGxDatabase a IGxDialog.StartingLocation.

5voto

Nathan Bedford Puntos 3157

Kirk respuesta está en el camino correcto. La única cosa que falta es adecuadamente la adición de la GxDatabase en el diálogo interno del árbol de catálogo.

Ver el código de abajo. El OpenGxDialogForRemoteWorkspace devuelve un enumerable de los objetos seleccionados (si multiselect está permitido) o null en caso de que el diálogo es cancelado. Es muy básico, ya que he omitido el objeto de filtros que utiliza, pero creo que se entiende la idea.

    private static IEnumerable<IGxObject> OpenGxDialogForRemoteWorkspace(IWorkspaceName workspaceName, int handle)
    {
        if (workspaceName == null) throw new ArgumentNullException("workspaceName");
        if (workspaceName.Type != esriWorkspaceType.esriRemoteDatabaseWorkspace)
        {
            throw new ArgumentException("Remote worskpace is expected.", "workspaceName");
        }

        var gxDatabase = new GxDatabaseClass();
        gxDatabase.WorkspaceName = workspaceName;

        var gxDialog = new GxDialogClass();
        var catalog = gxDialog.InternalCatalog;

        var topLevelCatalogItems = AsEnumerable(((IGxObjectContainer)catalog).Children);
        var remoteDatabaseFolder = topLevelCatalogItems.OfType<IGxRemoteContainer>().First();

        ((IGxObjectContainer)remoteDatabaseFolder).AddChild(gxDatabase);

        gxDialog.RememberLocation = false;

        object gxDatabaseObject = gxDatabase;
        gxDialog.set_StartingLocation(ref gxDatabaseObject);

        IEnumGxObject selection;
        if (gxDialog.DoModalOpen(handle, out selection))
        {
            return selection != null ? AsEnumerable(selection) : null;
        }

        return null;
    }

    private static IEnumerable<IGxObject> AsEnumerable(IEnumGxObject enumGxObject)
    {
        if (enumGxObject == null) throw new ArgumentNullException("enumGxObject");
        enumGxObject.Reset();

        IGxObject gxObject;
        while ((gxObject = enumGxObject.Next()) != null)
        {
            yield return gxObject;
        }
    }

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