Domanda

Sto usando i file XSD per convalidare i file XML. Nei file XSD, sono necessari solo alcuni elementi e il resto è facoltativo. Tuttavia, è sequenziale, quindi l'ordine degli elementi come appaiono nei lotti di materia dati. Dopo aver considerato alcuni scenari che l'utente potrebbe incontrare, ho trovato un po 'di problemi a risolvere.

Il caso è questo: ad esempio, ci sono 6 elementi A, B, C, D, E, F nel file XSD. Sono necessari solo a, c e d. L'utente inizia con A, C, D. Consento all'utente di aggiungere una colonna, con il nome B. Tuttavia, viene allegato alla fine: A, C, D, B. Pertanto, poiché è sequenziale, lo farà non convalidare.

Quindi la mia domanda è: come posso inserire B tra A e C per far passare la convalida XSD? O esiste un altro modo per riordinare le cose in DataGridView e rifletterlo nel dataTable?

Ho pensato di poter risolvere il problema consentendo all'utente di riordinare le colonne in DataGridView in cui viene visualizzata la tabella.

EDIT: supponendo che non posso modificare i file XSD.

Questo è,

    dataGridView1.AllowUserToOrderColumns = true;

Tuttavia, la convalida mi diceva sempre che era previsto un "elemento" dopo l'ultimo elemento necessario. Ciò significa che lo spostamento nel datacolumn in DataGridView non è stato riflesso nel dati stesso.

Per passare la convalida, credo che avrei bisogno di inserire la colonna nel rispettivo luogo è relativa a tutto il resto. O almeno inserirlo alla fine e riflettere l'ordine corretto quando l'utente preme il pulsante Convalida.

Mi sono imbattuto in altre cose online dicendomi di provare cose come:

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

Ma non l'ho ancora implementato. Qualche idea nel caso in cui quella linea sopra non funzioni? =) Inoltre, voglio essere in grado di sincronizzare il dati con ciò che l'utente fa in DataGridView. Sarebbe l'ideale. Se l'utente sposta le colonne in DataGridView, il dataTable dovrebbe riflettere tale modifica.

Qualsiasi intuizione è molto apprezzata, sarò felice di offrire ulteriori informazioni se necessario. Grazie!

Cordiali saluti, tf.rz

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

È stato utile?

Soluzione

Non avrebbe più senso farlo non Richiedere all'utente di inserire i dati in ordine di schema e invece di far determinare automaticamente l'ordine appropriato in base allo schema? Sembra che i tuoi schemi saranno di costruzione simile, dati i tuoi presupposti, quindi determinare l'ordine dallo schema non dovrebbe essere difficile.

Per ex., Potresti lasciare il DataTable Così com'è, corrispondere all'input dell'utente, con colonne in qualsiasi ordine arbitrario. Quando è necessario produrre i dati su XML, esaminare il file dello schema e identificare la sequenza di elementi che dovrebbero essere emettiti. Itera sull'elenco degli elementi e le colonne corrispondenti di output dal tuo DataTable Come sono trovati.

Per elaborare il file dello schema e scoprire la sequenza, è possibile utilizzare System.Xml.Schema.XmlSchema, o, poiché lo schema è esso stesso XML, è possibile interrogare direttamente l'XML usando XmlDocument, XPath, XDocument eccetera.

Altri suggerimenti

Non hai dato il tuo XSD, ma immagino che tu stia usando

 <xs:sequence>.

Usa invece

 <xs:all>

per esempio

 <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'esempio sopra indica che gli elementi "FirstName" e "LastName" possono apparire in qualsiasi ordine e ogni elemento può apparire zero o una volta!

Vedere http://www.w3schools.com/schema/el_all.asp Per ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top