我有这样的XML字符串:
xmlstring =
"<?xml version='1.0' encoding='utf-8'?>" &
"<ArrayOfMyData xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" &
" <MyData>" &
" <ID>80</ID>" &
" <MyDate>2019-08-07T07:15:32.123</MyDate>" &
" <MyBool>true</MyBool>" &
" </MyData>" &
" <MyData>" &
" <ID>1</ID>" &
" <MyDate>2019-10-16T14:23:23.654</MyDate>" &
" <MyBool>false</MyBool>" &
" </MyData>" &
" <MyData>" &
" <ID>203</ID>" &
" <MyDate>2019-10-25T11:02:26.789</MyDate>" &
" <MyBool>false</MyBool>" &
" </MyData>" &
"</ArrayOfMyData>"
然后我将其自动加载到DataGridView:
Dim dataSet As DataSet = New DataSet()
dataSet.ReadXml(New StringReader(xmlstring))
dgv_list.DataSource = dataSet.Tables(0)
那进展很好。
DataGridView自动生成在快速填充的网格中可见的列和行。
但是问题在于列的类型为string, string, string
,而我希望integer, date, boolean
是出于(重新)排序的目的。
作为替代方案,我知道一种“手动”创建/设置列的方法,然后逐单元/逐行填充DGV单元。
如果有任何技巧/解决方案可以改变显示列的值类型以保持最大程度的自动化,我会感到很有趣吗?
我尝试在_ColumnAdded
处理程序下更改ValueValue列,在_CellFormating
事件处理程序下更改写入的数据,等等。但是一切都没有任何想要的结果。
请帮助!
答案 0 :(得分:2)
您可以在XML中添加类型的架构,然后使用.XmlReadMode.ReadSchema
进行读取。
这样做列类型具有相同的类型。
作为测试,将此xml放在文件“C:\Users\Principal\Documents\OtherPath\Test.xml”
中的某个位置,而不是代码中的变量中。
类型的一部分是xs:schema
<?xml version="1.0" standalone="yes"?>
<ArrayOfMyData>
<xs:schema id="ArrayOfMyData" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ArrayOfMyData" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="MyData">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:int" minOccurs="0" />
<xs:element name="MyDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="MyBool" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<MyData>
<ID>80</ID>
<MyDate>2019-08-07T07:15:32.123+02:00</MyDate>
<MyBool>true</MyBool>
</MyData>
<MyData>
<ID>23</ID>
<MyDate>2019-08-05T07:15:32.123+02:00</MyDate>
<MyBool>false</MyBool>
</MyData>
</ArrayOfMyData>
然后读取架构类型
Dim dataSet As DataSet = New DataSet()
dataSet.ReadXml("C:\Users\Principal\Documents\OtherPath\Test.xml", XmlReadMode.ReadSchema)
或
Dim dataSet As DataSet = New DataSet()
Dim xmlS As String = IO.File.ReadAllText("C:\Users\Principal\Documents\OtherPath\Test.xml")
dataSet.ReadXml(New StringReader(xmlS), XmlReadMode.ReadSchema)
您还可以使用Schema将XML保存为文件
dataSet.SchemaSerializationMode = SchemaSerializationMode.IncludeSchema
dataSet.WriteXml("C:\Users\Principal\Documents\OtherPath\Test.xml", XmlWriteMode.WriteSchema)