C# 在datatable中对列重新排序?
我使用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文件 就是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验证通过?或者是否有其他方法
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>