2012-04-25 1 views
2

J'ai des données que j'attrape dans une base de données et je veux utiliser ces valeurs pour remplir les propriétés des formes sur un diagramme de visio. J'ouvre mon propre modèle, et affiche des formes sur la feuille sans problème. Icône serveur a des propriétés personnalisées telles que « fabricant », « réseau », etc. Lorsque j'imprime les propriétés personnalisées pour chaque forme, je reçois la sortie suivante:Utilisation de visio pour automatiser le schéma de dessin avec C# - impossible de définir les propriétés personnalisées

forme = Etikett = Fabricant Valeur = 0

etc. Tout est correct puisque je n'ai encore défini aucune valeur. Quand je vais définir les valeurs, en utilisant le code dans le SDK Visio 2003 (SettingACustomProperty.cs), j'obtiens une erreur que "cette forme n'a pas une propriété personnalisée avec le nom universel du fabricant" - encore en imprimant clairement les propriétés personnalisées montre qu'il le fait (tout comme regarder la shapeSheet une fois que la forme est dessinée dans Visio). J'ai inséré à comment j'appelle SettingACustomProperty. Quelqu'un peut-il m'aider à comprendre ce que je dois faire pour insérer des valeurs dans mes propriétés personnalisées sur une forme?

Voici comment j'appelle le code (à des fins de test, je l'ai moi-même inséré cordes):

string keyword = "Manufacturer"; 
    string manuValue = "\"Dell\""; 

    string three = SettingACustomProperty.SetCustomPropertyFormula(visioStarShape, keyword, manuValue); 
+0

Cela vous aidera si vous pouvez fournir un lien vers un petit fichier d'exemple qui présente ce problème. J'ai essayé du code pour définir des propriétés personnalisées et tout a fonctionné, donc cela pourrait être quelque chose de spécifique avec votre document ou les pochoirs dans le document. – saveenr

+0

saveenr - voici ce que j'essayais, mais cela ressemble à ce que je référençais les étiquettes, pas le nom universel réel - [code] – Kathy

+0

@saveenr - pouvez-vous poster un exemple de la façon dont vous avez changé un nom universel pour une coutume propriété d'une forme? – Kathy

Répondre

2

propriétés Visio personnalisées ont trois concepts différents qui peuvent être considérés comme un nom.

Le premier est l'étiquette. C'est ce que vous voyez généralement dans l'interface utilisateur et il est stocké dans la cellule d'étiquette de la ligne de propriété personnalisée dans la feuille de calcul. L'étiquette n'est généralement pas utilisée pour accéder à la propriété personnalisée par programmation.

La seconde est le nom de la ligne. C'est le nom que vous verrez lorsque vous regarderez la ligne de propriété personnalisée dans la feuille de calcul. Il apparaîtra devant les autres cellules de la rangée et sera préfixé avec "Prop." C'est l'automate accédé via le Name property de la ligne de propriété personnalisée.

Le nom de la dernière ligne est le nom universel. Le nom universel existe principalement pour permettre au code de trouver des objets Visio spécifiques par nom même après que le nom a été modifié lorsque l'objet est localisé, c'est-à-dire que le nom a été traduit. Le nom universel peut être accédé en utilisant le NameU property de la ligne de propriété personnalisée. Pour en savoir plus sur les noms universels, voir Using Universal Names and Syntax to Localize Your Visio Solutions

Lorsque vous appelez SetCustomPropertyFormula, le deuxième argument doit être le nom universel. En effet, SetCustomPropertyFormula utilise en interne get_CellsU qui trouve une cellule de propriété personnalisée en utilisant le nom universel de la ligne. Je suspecte que vous utilisez l'étiquette ou le nom de ligne, pas le nom universel, lors de l'appel SetCustomPropertyFormula.

Si vous utilisez l'étiquette, vous devez utiliser le nom universel.

Si vous utilisez le nom, il ne correspond plus au nom universel. Cela peut arriver dans certaines circonstances lorsque vous renommez la ligne. Vous pouvez trouver le nom universel et l'utiliser dans votre code. La fenêtre immédiate VBA est souvent un moyen facile d'obtenir la propriété NameU d'une ligne. Vous pouvez également mettre à jour la forme ou le maître à partir duquel elle a été instanciée pour définir la propriété NameU sur la propriété Name, puis vous éviterez cette confusion (jusqu'à ce que vous renommiez la ligne).

+0

Cela a du sens - j'essayais de définir le nom universel, mais en référençant vraiment l'étiquette. Lors de l'impression des noms universels de lignes, j'ai remarqué qu'un bon nombre d'entre eux ont des noms tels que "R23", "G87". Y at-il un moyen de changer cela dans mon modèle? – Kathy

+0

Vous pouvez mettre à jour les masters dans les stencils que vous utilisez pour définir le NameU égal au Nom. Si vous modifiez des masters, n'oubliez pas d'utiliser [Master.Open] (http://msdn.microsoft.com/en-us/library/ff766060.aspx) et [Master.Close] (http://msdn.microsoft.com /en-us/library/ff766772.aspx). –

+0

Quelqu'un a-t-il un code d'échantillon que je pourrais voir? J'ai imprimé les noms universels en utilisant la fonction NameU, puis essayé de définir la valeur en utilisant ces noms, et il me dit toujours qu'il n'y a pas de cellules avec ce nom ... Aussi, comment mettre à jour la propriété NameU via Visio lui-même? J'ouvre le même pochoir encore et encore, donc je ne veux pas changer ces choses par programme si possible. – Kathy

1

Kathy: Vous pouvez trouver le nom que vous devez utiliser

Debug.Print visioStarShape.Section(visSectionProp).Row(0).NameU 

Ajouter "Prop." avant ce nom pour l'utiliser dans votre code.

Alternativement, la forme choisie, vous pouvez afficher le ShapeSheet en cliquant sur ce bouton dans la boîte à outils développeur

Show ShapeSheet button

Vous voyez quelque chose comme ça. Cherchez la section Propriétés personnalisées où vous voyez les étiquettes et le nom de vos propriétés:

enter image description here

Ensuite, vous utilisez ce nom pour faire référence à la propriété (c'est votre mot clé string).

keyword = """Prop.CustProp1""" 

or.... 

keyword = "\"Prop.CustProp1"\" 

, vous n'avez pas encore besoin du fichier SettingACustomProperty.cs, puisque vous pouvez faire référence à toutes les cellules de la feuille de la forme de votre code VBA. Il est possible pour vous d'obtenir ou de définir la formule en eux.

Voyez si cela répond à vos besoins. C'est une réponse que je viens de poster dans Office Techcenter: http://social.technet.microsoft.com/Forums/office/en-US/c837db4c-b90c-4500-b8ae-8d36efca44b6/can-i-apply-custom-property-sets-from-vba-in-visio-2003

Depuis que mon système est espagnol, j'ai changé le nom du gabarit et du maître par deviner. Mais les méthodes importantes sont AddSection, AddNamedRow et surtout pour vous le .Formula (FormulaForce est le même, mais cela fonctionne même avec des cellules protégées avec la fonction GUARD).

Bonne chance. Je suis en amour avec Visio 2003 (je souhaite que mon entreprise avait acheté Visio 2010, bien que): D

'Set the value for the property: vsoShape is an object referencing the shape 
vsoShape.Cells("Prop.CustProp1").FormulaU = """Hello""" 
vsoShape.Cells("Prop.CustProp2").FormulaU = 2556 

Le type de CustProp1 est une chaîne, et celle de CustProp2 est le numéro.

Cordialement,

Questions connexes