【发布时间】:2016-08-15 09:23:35
【问题描述】:
我正在尝试在 DataGridView 中保存和加载 XML 字符串。
使用以下代码,我可以做到这一点,但列的数据类型会丢失,然后整个网格只填充字符串。在这种情况下,格式化和排序不再有效。
在显示过程中我可以做些什么来保留原始数据类型吗?
我想要可用于我的其他项目的解决方案。
Imports System
Imports System.Text
Imports System.Xml
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
dgv.Columns.Add("col0", "col0")
dgv.Columns(0).ValueType = Type.GetType("Integer")
dgv.Columns.Add("col1", "col1")
dgv.Columns.Add("col2", "col2")
dgv.Columns(2).ValueType = Type.GetType("Double")
dgv.Columns(2).DefaultCellStyle.Format = "N2"
dgv.Rows.Add({CInt("1"), "John", CDbl("0,11")})
dgv.Rows.Add({CInt("2"), "Mary", CDbl("2,8")})
dgv.Rows.Add({CInt("3"), "Mike", CDbl("10,125")})
dgv.Rows.Add({CInt("4"), "Suzy", CDbl("2")})
End Sub
Private Sub dgv_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv.Leave
If dgv.Rows.Count - 1 > 0 Then
Dim dsa As DataSet = New DataSet()
dsa.DataSetName = "xdgv"
Dim dxs As DataTable = GetDataTableFromDGV(dgv)
dsa.Tables.Add(dxs)
''save xml from dgv content to textbox
TextBox1.Text = GenerateXML(dsa)
End If
End Sub
Private Function GenerateXML(ByVal xds As DataSet) As String
Dim obj As New StringWriterUtf8()
Dim xmlstring As String
xds.WriteXml(obj, XmlWriteMode.IgnoreSchema)
xmlstring = obj.ToString()
Return xmlstring
End Function
Private Function GetDataTableFromDGV(ByVal dgv As DataGridView) As DataTable
Dim dt = New DataTable()
Dim t As Integer = 0
For Each column As DataGridViewColumn In dgv.Columns
If column.Visible Then
dt.Columns.Add(dgv.Columns(t).Name)
t += 1
End If
Next
Dim cellValues As Object() = New Object(dgv.Columns.Count - 1) {}
For Each row As DataGridViewRow In dgv.Rows
If Not row.IsNewRow Then
For i As Integer = 0 To row.Cells.Count - 1
cellValues(i) = If(row.Cells(i).Value Is Nothing, String.Empty, row.Cells(i).Value)
Next
dt.Rows.Add(cellValues)
End If
Next
Return dt
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
''load xml from textbox back to dgv
dgv.Rows.Clear()
If Not String.IsNullOrEmpty(TextBox1.Text) Then
Try
Dim Stream As StringReader = New StringReader(TextBox1.Text)
Dim xreader As XmlTextReader = New XmlTextReader(Stream)
Dim ds As DataSet = New DataSet
ds.ReadXml(xreader)
For Each table As DataTable In ds.Tables
For Each row As DataRow In table.Rows
dgv.Rows.Add(row.ItemArray())
Next row
Next table
ds = Nothing
Catch ex As Exception
MessageBox.Show("xmlFoo: " + ex.Message)
End Try
End If
End Sub
End Class
Public Class StringWriterUtf8
Inherits System.IO.StringWriter
Public Overrides ReadOnly Property Encoding() As Encoding
Get
Return Encoding.UTF8
End Get
End Property
End Class
为了成功运行此代码,您需要一个带有 Form1 的新项目,其中包含 DataGridView="dgv"、Text box="TextBox1" 和 Button="Button1"。
【问题讨论】:
标签: xml vb.net datagridview