Question

J'utilise des fichiers XSD pour valider les fichiers xml. Dans les fichiers XSD, seuls quelques-uns des éléments nécessaires et les autres sont en option. Cependant, il est séquentiel si l'ordre des éléments tels qu'ils apparaissent dans les lots de matière DataTable. Après avoir examiné quelques scénarios que l'utilisateur peut rencontrer, je suis venu avec un cas que j'ai un peu la résolution de problèmes.

Le cas est la suivante: Par exemple, Il existe 6 éléments A, B, C, D, E, F dans le fichier XSD. Seulement A, C et D sont nécessaires. L'utilisateur commence par A, C, D. Je permet à l'utilisateur d'ajouter une colonne, avec le nom B. Cependant, il se joint à la fin. A, C, D, B. Par conséquent, depuis sa séquence, il ne validera pas

Alors, ma question est, comment puis-je insérer B entre A et C pour que la validation xsd passer? Ou est-il une autre façon de réorganiser les choses dans le datagridview et refléter le fait que dans le datatable?

Je pensais que je serais en mesure de résoudre le problème en permettant à l'utilisateur de réorganiser les colonnes du datagridview où la table est affichée.

EDIT: Sous l'hypothèse que je ne peux pas modifier les fichiers XSD.

Par conséquent,

    dataGridView1.AllowUserToOrderColumns = true;

Cependant, la validation m'a toujours dit qu'un « élément » après le dernier élément nécessaire était prévu. Cela signifie que le déplacement de la DataColumn dans le datagridview n'a pas été pris en compte dans la table de données lui-même.

Pour passer la validation, je crois que je aurais besoin d'insérer la colonne dans la place respective, il est par rapport à tout le reste. Ou au moins l'insérer à la fin et reflètent l'ordre approprié lorsque l'utilisateur appuie sur le bouton de validation.

Je suis venu à travers d'autres choses me disant en ligne pour essayer des choses comme:

    Table.Columns["Column Name"].SetOrdinal(NewIndex);

Mais je n'ai pas encore mis en œuvre. Toutes les idées dans le cas où la ligne ci-dessus ne fonctionne pas? =) De plus, je veux être en mesure de synchroniser le DataTable avec ce que l'utilisateur fait dans le datagridview. Ce serait idéal. Si l'utilisateur déplace les colonnes du datagridview, datatable devrait refléter ce changement.

Toute idée est très apprécié, je serai heureux d'offrir des informations supplémentaires si nécessaire. Merci!

Cordialement, tf.rz

(. NET 3.5 SP1, Visual Studio C # 2008)

Était-ce utile?

La solution

Ce ne serait pas plus judicieux de pas obliger l'utilisateur à entrer les données dans l'ordre de schéma, et à la place ont le système détermine automatiquement l'ordre approprié en fonction du schéma? Il semble que votre schéma (s) sera de construction similaire compte tenu de vos hypothèses, afin de déterminer l'ordre du schéma ne devrait pas être difficile.

Ex., Vous pouvez quitter le DataTable tout comme, correspondant à l'entrée d'utilisateur, avec des colonnes dans un ordre arbitraire. Lorsque vous avez besoin pour produire les données au format XML, examinez le fichier de schéma et d'identifier la séquence d'éléments qui devraient être sortie. Itérer sur la liste des éléments et des colonnes correspondantes de sortie de votre DataTable car ils sont trouvés.

Pour traiter le fichier de schéma et de découvrir la séquence, soit vous pouvez utiliser System.Xml.Schema.XmlSchema, ou, comme le schéma lui-même est xml, vous pouvez interroger le fichier XML directement à l'aide XmlDocument, XPath, XDocument etc.

Autres conseils

Vous avez pas donné votre XSD, mais je devine que vous utilisez

 <xs:sequence>.

Au lieu d'utiliser

 <xs:all>

par exemple.

 <xs:element name="person">
  <xs:complexType>
   <xs:all minOccurs="0">
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
 </xs:element>

L'exemple ci-dessus indique que la « prenom » et les éléments « LastName » peuvent apparaître dans un ordre quelconque et chaque élément peut apparaître zéro ou une fois!

Voir http://www.w3schools.com/schema/el_all.asp pour plus d'infos.

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