2011-06-14 85 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