对数据表中的列重新排序?

时间:2011-06-14 21:19:39

标签: c# datatable xsd-validation datacolumn

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

2 个答案:

答案 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,XPathXDocument等。