C# 在datatable中对列重新排序?

C# 在datatable中对列重新排序?,c#,datatable,xsd-validation,datacolumn,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验证通过?或者是否有其他方法

我使用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中的内容并在datatable中反映这些内容

我想我可以通过允许用户对datagridview中显示表的列重新排序来解决这个问题

编辑: 假设我不能修改xsd文件

就是

    dataGridView1.AllowUserToOrderColumns = true;
然而,验证总是告诉我,在最后一个必需的元素之后应该有一个“元素”。这意味着datagridview中datacolumn中的移位没有反映在datatable本身中

为了通过验证,我相信我需要在与其他内容相关的相应位置插入列。或者至少在末尾插入,并在用户按下验证按钮时反映正确的顺序

我在网上遇到了一些其他的事情,告诉我去尝试一些事情,比如:

    Table.Columns["Column Name"].SetOrdinal(NewIndex);
但我还没有实施它。如果上面这行行不通,你有什么想法吗?=) 此外,我希望能够将datatable与用户在datagridview中的操作同步。那将是理想的。如果用户移动datagridview中的列,datatable应反映该更改

非常感谢您的任何见解,如果需要,我将乐意提供更多信息。谢谢

真诚地, tf.rz


(.NET3.5SP1,VisualStudioC#2008)

您尚未提供XSD,但我猜您正在使用

 <xs:sequence>.
改用

 <xs:all>

e、 g


上面的例子表明“firstname”和“lastname”元素可以以任何顺序出现,每个元素可以出现零次或一次


请参阅以获取更多信息。

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

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


要处理模式文件并发现序列,您可以使用
System.Xml.schema.XmlSchema
,或者,由于模式本身就是Xml,您可以直接使用
XmlDocument
XPath
XDocument
等查询Xml。

谢谢您的快速回答,但我假设不允许我修改xsd文件。很抱歉沟通不畅,那是我的错。为了保持一致性,我需要保持一定的顺序。=)哇,这太简单了。可悲的是,我从未想过这一点。我一定会继续努力,看看我将如何执行这样一项任务。这不应该太难。谢谢你的帮助!我会让你知道事情的进展什么离合器,经过一些调整和测试后100%工作。他是上帝。我找到了解决问题的方法,但你确实让我开始了。谢谢!享受50次重复!;)
 <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>