2011-06-14 64 views
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中datacolumn的移位并未反映在数据表本身中。

为了通过验证,我相信我需要在相应的地方插入列,它是相对于其他任何东西。或者至少在最后插入它,并在用户按下确认按钮时反映正确的顺序。

我已经遇到一些其他的东西在网上告诉我要尝试的东西,如:

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

但我还没有付诸实施。如果上述行不起作用,任何想法? =) 此外,我希望能够将数据表与用户在datagridview中执行的操作同步。这将是理想的。如果用户移动datagridview中的列,则数据表应反映该更改。

任何洞察力非常感谢,我很乐意提供额外的信息,如果需要。谢谢!

真诚, tf.rz

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

回答

1

而不是要求用户按架构顺序输入数据,而是让系统根据架构自动确定适当的顺序吗?看起来,根据您的假设,您的模式将具有相似的结构,因此从模式中确定顺序并不困难。

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

要处理的架构文件和发现的顺序,你既可以使用System.Xml.Schema.XmlSchema,或者,作为架构本身是XML,你可以直接使用XmlDocumentXPathXDocument

+0

哇,这太简单了。可悲的是我从来没有想过这件事。我一定会着手,看看我将如何实施这样的任务。它不应该太难。谢谢您的帮助!我会让你知道它是怎么回事。 ;) – 2011-06-28 15:29:39

+0

什么离合器,经过一些调整和测试100%工作。 XPath是一位神。我找到了解决问题的办法,但你肯定让我开始了。非常感谢!享受50代表! ;) – 2011-06-28 21:05:29

+0

@ tf.rz我很高兴它为你工作! – 2011-06-29 02:53:27

1

你还没有给你的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> 

上面的例子表明,“姓名”和“姓”元素可以以任何顺序出现,并且每个元素可以出现零个或一个时间!

有关更多信息,请参阅http://www.w3schools.com/schema/el_all.asp

+0

感谢的提示查询XML答案,但我假设我不允许更改xsd文件。对不起,沟通不畅,这是我的错。为了保持一致性,我需要保持一定的顺序。 =) – 2011-06-14 21:41:44