2

我正在使用 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)

4

2 回答 2

2

你还没有给你的 XSD,但我猜你正在使用

 <xs:sequence>.

而是使用

 <xs:all>

例如

 <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

于 2011-06-14T21:25:14.873 回答
1

要求用户按模式顺序输入数据,而是让系统根据模式自动确定适当的顺序不是更有意义吗?鉴于您的假设,您的模式似乎具有相似的结构,因此从模式中确定顺序应该不难。

例如,您可以保持DataTable原样,匹配用户输入,列任意顺序。当您需要将数据输出到 xml 时,请检查模式文件并确定应输出的元素序列。遍历元素列表,并DataTable在找到匹配列时从您的列中输出。

要处理架构文件并发现序列,您可以使用System.Xml.Schema.XmlSchema,或者,由于架构本身就是 xml,您可以使用 、 等直接XmlDocument查询XPathxml XDocument

于 2011-06-28T04:08:42.830 回答