设置/更改有界DataGridView的ValueType

时间:2019-12-18 19:47:25

标签: .net vb.net datagridview

我有这样的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事件处理程序下更改写入的数据,等等。但是一切都没有任何想要的结果。

请帮助!

1 个答案:

答案 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)