Question

dans mon application, j'extrait des éléments d'un fichier de projet Microsoft à l'aide de mpxj - l'un des éléments dont j'ai besoin sont les prédécesseurs.La façon dont je peux extraire le prédécesseur consiste à utiliser une fonction intégrée de mpxj qui renvoie un type de java.util.list - je peux l'enregistrer dans une variable en tant qu'objet, mais je dois trouver un moyen d'amener les données à un format que je peux facilement utiliser pour pouvoir le stocker dans une base de données.Vous trouverez ci-dessous la ligne de code que j'utilise pour extraire les prédécesseurs du fichier de projet.

Dim predecessors = task.getPredecessors

et voici le résultat en mettant un point de trace pour obtenir la valeur des prédécesseurs

[[Relation [Task id=4 uniqueID=45577 name=Standards Training - Round 2] -> [Task id=3 uniqueID=45576 name=Process Excellence Training]]]

Même si je pouvais obtenir ce qui précède sous forme de chaîne, je pourrais travailler suffisamment avec pour obtenir les données dont j'ai besoin.L'exemple ci-dessus est celui où il y a 1 élément dans la liste des prédécesseurs, mais il y a parfois plusieurs éléments.Voici un exemple de point de trace lorsqu'il y a plusieurs éléments.

[[Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=47 uniqueID=45857 name=Organizational Assessment]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=49 uniqueID=45859 name=Document Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=56 uniqueID=45866 name=Infrastructure Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=58 uniqueID=45868 name=IT Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=60 uniqueID=45870 name=Organizational Deliverables]]]

Merci pour votre aide.

Était-ce utile?

La solution 3

a pu compléter cela en utilisant la touche puis à droite et à gauche pour couper ce dont j'ai besoin, beaucoup plus rapide - ne sais pas pourquoi cela a été supprimé avant

Autres conseils

En C# 3.5+, créer une méthode d'extension pour vous offrir un énumérateur agréable et sécurisé pour ces listes Java est vraiment simple en raison de yield mot-clé.Vous pouvez procéder ainsi :

public static class JavaExtensions
{

        public static IEnumerable<T> toIEnumerable<T>(this java.util.List list)
        {
            if (list != null)
            {
                java.util.Iterator itr = list.iterator();

                while (itr.hasNext())
                {
                    yield return (T)itr.next();
                }
            }
        }

}

Tant que l'espace de noms contenant cette extension est visible pour votre code, vous pouvez simplement procéder comme suit pour travailler avec les prédécesseurs :

foreach (var relation in task.getPredecessors().toIEnumerable<Relation>())
{
   Task sourceTask = relation.getSourceTask();
   //etc.
}

Malheureusement pour vous, vous utilisez VB.Net.J'étais dans le même bateau que vous et j'ai fini par créer une bibliothèque de classes C# distincte à laquelle je fais référence dans mon projet VB ASP.NET.De cette façon, je bénéficie des avantages de la syntaxe C# pour gérer les objets de style Java IKVM sans avoir à convertir l'intégralité de mon projet.

Si vous ne voulez pas faire ça, vous pouvez utiliser un convertisseur de code en ligne pour changer le code de Jon (qui n'utilise aucune fonctionnalité C# uniquement) en VB et l'inclure dans votre projet.

L'essentiel dans votre cas ci-dessus est que vous n'avez pas besoin de travailler avec la représentation sous forme de chaîne que vous voyez dans le débogueur (il s'agit simplement d'appeler toString() sur les objets Relation de cette liste).Le getPredecessors() la fonction renvoie une liste de Relation objets.

Dim predecessorList as java.util.List = task.getPredecessors()
Dim iter as java.util.Iterator = predecessorList.iterator()

Do While iter.hasNext()
    Dim curRelation as Relation = iter.next()

    'gets the left side of the relationship (the task you are dealing with)
    Dim sourceTask as Task = curRelation.getSourceTask()

    'gets the task that is the predecessor to the  'source' task
    Dim targetTask as Task = curRelation.getTargetTask()

    'from here you can call methods on the Task objects to get their other properties
    'like name and id
Loop

Il existe deux façons de travailler avec des collections Java lors de l'utilisation d'un ensemble .NET produite par IKVM.Le premier est de faire les choses de la voie Java et de travailler avec un itérateur:

java.util.List predecessors = task.getPredecessors();
java.util.Iterator iter = predecessors.iterator();
while (iter.hasNext())
{
   Relation rel = (Relation)iter.next();
   System.Console.WriteLine(rel);
}

L'autre moyen consiste à ajouter un peu de code "convivial" pour masquer ceci:

foreach(Relation rel in ToEnumerable(task.getPredecessors()))
{
   System.Console.WriteLine(rel);
}

Pour ce faire, j'ai créé la méthode "toenumerable":

private static EnumerableCollection ToEnumerable(Collection javaCollection)
{
   return new EnumerableCollection(javaCollection);
}

et la classe Enumerablecollection, qui masque l'utilisation de l'itérateur:

class EnumerableCollection
{
    public EnumerableCollection(Collection collection)
    {
        m_collection = collection;
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(m_collection);
    }

    private Collection m_collection;
}


public struct Enumerator : IEnumerator
{
    public Enumerator(Collection collection)
    {
        m_collection = collection;
        m_iterator = m_collection.iterator();
    }

    public object Current
    {
        get
        {
            return m_iterator.next();
        }
    }

    public bool MoveNext()
    {
        return m_iterator.hasNext();
    }

    public void Reset()
    {
        m_iterator = m_collection.iterator();
    }

    private Collection m_collection;
    private Iterator m_iterator;
}

Un moyen plus intéressant de faire cela serait d'utiliser méthodes d'extension pour ajouter cette fonctionnalité àLes classes de collection Java, qui rendraient votre code un peu moins encombré.Je prévois d'essayer d'envoyer un assemblage contenant des méthodes d'extension utiles dans le cadre de MPXJ lors de la prochaine version.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top