我正在使用xsd文件来验证xml文件。在xsd文件中,只需要几个元素,其余元素是可选的。但是,它是顺序的,因此它们出现在数据表中的元素顺序很多。在考虑了用户可能遇到的一些情况之后,我想出了一个案例,我解决了一些问题。
案例如下: 例如, xsd文件中有6个元素A,B,C,D,E,F。只需要A,C和D. 用户从A,C,D开始。我允许用户添加名称为B的列。 然而,它附加在最后:A,C,D,B。因此,由于它是连续的,它不会被验证。
所以我的问题是,如何在A和C之间插入B以便xsd验证通过?或者还有其他方法可以重新排序datagridview中的内容并在数据表中反映出来吗?
我以为我可以通过允许用户重新排序显示表格的datagridview中的列来解决问题。
编辑: 假设我无法改变xsd文件。
即,
dataGridView1.AllowUserToOrderColumns = true;
然而,验证总是告诉我在预期最后一个必要元素之后的“元素”。这意味着datagridview中数据列的移位没有反映在数据表本身中。
为了通过验证,我相信我需要在相对于其他所有内容的相应位置插入列。或者至少在最后插入它并在用户按下验证按钮时反映正确的顺序。
我在网上遇到其他一些事情告诉我尝试以下事情:
Table.Columns["Column Name"].SetOrdinal(NewIndex);
但我还没有实现它。如果上述行不起作用的任何想法? =) 另外,我希望能够将数据表与用户在datagridview中执行的操作同步。那将是理想的。如果用户移动datagridview中的列,则数据表应反映该更改。
非常感谢任何见解,如果需要,我很乐意提供更多信息。谢谢!
此致 tf.rz
(。NET 3.5 SP1,Visual Studio C#2008)
答案 0 :(得分:1)
你没有给你的XSD,但我猜你正在使用
<xs:sequence>.
改为使用
<xs:all>
e.g。
<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>
上面的例子表明“firstname”和“lastname”元素可以按任何顺序出现,每个元素可以出现零次或一次!
有关详细信息,请参阅http://www.w3schools.com/schema/el_all.asp。
答案 1 :(得分:1)
不要求用户以架构顺序输入数据,而不是让系统根据架构自动确定适当的顺序,这不是更有意义吗?根据您的假设,您的架构似乎具有相似的结构,因此从架构中确定顺序并不困难。
例如,您可以将DataTable
保留原样,与用户输入匹配,以任意顺序排列。当您需要将数据输出到xml时,请检查模式文件并确定应输出的元素序列。迭代元素列表,并在找到DataTable
时输出匹配列。
要处理模式文件并发现序列,您可以使用System.Xml.Schema.XmlSchema
,或者,因为模式本身是xml,您可以使用XmlDocument
直接查询xml,XPath
,XDocument
等。