DataGridView不重建vb.net中的xml文件内容

本文关键字:xml 文件 中的 net 重建 vb DataGridView | 更新日期: 2023-09-27 18:05:29

我正试图从DataGridView中的xml文件重建表值。首先,我读取xml文档,然后加载它作为数据源在DataGridView

Try
    Dim ds As DataSet = New DataSet
    ds.ReadXml("data.xml")
    bs.DataSource = ds.Tables(0)
    GridView.DataSource = bs
Catch ex As Exception
    MessageBox.Show(ex.ToString)
End Try

现在在一个按钮上单击我想重建数据表我已经尝试了不同的方法,但不工作

OnButton_Click
    bs.ResetBindings(False) ' Only blinks but does not work '
OnButton_Click
    bs.Clear()
    bs.DataSource = ds.Tables(0) ' Still does not work '
OnButton_Click
    GridView.DataSource = Nothing
    GridView.DataSource = bs
OnButton_Click
    GridView.Refresh()

谁能指出我错在哪里

--------------------- 更新 -------------------

XML文件是单独生成和维护的,而不是通过在gridview本身中编辑

Private Sub addClient(ByRef hwid As String, ByRef dataID As String, ByRef dataValue As String)
    Dim xmlDoc As New XmlDocument()
    xmlDoc.Load(_datapath)
    Dim rootNode As XmlNode = xmlDoc.SelectSingleNode("users")
    Dim userNodes As XmlNodeList = rootNode.SelectNodes("user")
    Dim userNode As XmlNode = rootNode.SelectSingleNode("user")
    Dim Isuid As Boolean = False

    For Each uNode As XmlNode In userNodes
        If IsNothing(uNode.Attributes("uid")) Then
            Dim idAttr As XmlAttribute = xmlDoc.CreateAttribute("uid")
            idAttr.InnerText = hwid
            uNode.Attributes.Append(idAttr)
            Dim idNode As XmlNode = xmlDoc.CreateElement(dataID)
            idNode.InnerText = dataValue
            userNode.AppendChild(idNode)
        Else
            If uNode.Attributes("uid").Value = hwid Then
                ' Alter data '
                Isuid = True
                userNode = uNode
                GoTo end_of_for
            End If
        End If
    Next

end_of_for:
    If Isuid = True Then
        ' Alter the data '
        If IsNothing(userNode.SelectSingleNode(dataID)) Then
            Dim idNode As XmlNode = xmlDoc.CreateElement(dataID)
            idNode.InnerText = dataValue
            userNode.AppendChild(idNode)
        Else
            Dim idNode As XmlNode = userNode.SelectSingleNode(dataID)
            idNode.InnerText = dataValue
            userNode.AppendChild(idNode)
        End If
    Else
        ' Create a new one '
        If rootNode.SelectSingleNode("user").Attributes("uid").Value <> hwid Then
            userNode = xmlDoc.CreateElement("user")
            rootNode.AppendChild(userNode)
            Dim idAttr As XmlAttribute = xmlDoc.CreateAttribute("uid")
            idAttr.InnerText = hwid
            userNode.Attributes.Append(idAttr)
            Dim idNode As XmlNode = xmlDoc.CreateElement(dataID)
            idNode.InnerText = dataValue
            userNode.AppendChild(idNode)
        End If
    End If
do_exit:
    xmlDoc.Save(_datapath)
End Sub

这是我剩下的代码

Private _datapath As String = "data.xml"
Dim bs As New BindingSource
Dim ds As New DataSet
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Add user element also '
    If Not File.Exists(_datapath) Then
        Dim xmlDoc As New XmlDocument()
        Dim docNode As XmlNode = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
        xmlDoc.AppendChild(docNode)
        Dim rootNode As XmlNode = xmlDoc.CreateElement("users")
        xmlDoc.AppendChild(rootNode)
        Dim userNode As XmlNode = xmlDoc.CreateElement("user")
        rootNode.AppendChild(userNode)
        xmlDoc.Save(_datapath)
    End If
    Try
        ds.ReadXml(_datapath)
        bs.DataSource = ds.Tables(0)
        ClientView.DataSource = bs
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try
End Sub
Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
bs.ResetBindings(False)
End Sub

DataGridView不重建vb.net中的xml文件内容

Edit2:所以如果我再次加载文件(button1_Click),它仍然在工作。我注意到如果xml模式与xml文件不匹配,则不工作。如果模式不正确,我得到的结果和你一样;网格中没有数据

Edit:如果在某些情况下不更改xml的结构模式,则在重新绑定之前检查。这对我很有效。在读取xml之前也需要读取模式。

public partial class Form1 : Form
{
    DataSet ds1 = new DataSet();
    BindingSource bs1 = new BindingSource();
    public Form1()
    {
        InitializeComponent();
    }
    //Initial
    private void button1_Click(object sender, EventArgs e)
    {
        DataTable dt1 = new DataTable();
        ds1.ReadXmlSchema("XMLFile1Schema.xml");
        ds1.ReadXml("XMLFile1.xml", XmlReadMode.ReadSchema);
        bs1.DataSource = ds1.Tables[0];
        dataGridView1.DataSource = bs1;
    }
    //Change content
    private void button2_Click(object sender, EventArgs e)
    {
        DataTable dt2 = new DataTable();
        dt2.Columns.Add("Column1");
        dt2.Columns.Add("Column2");
        dt2.Rows.Add("B11", "B12");
        dt2.Rows.Add("B21", "B22");
        dataGridView1.DataSource = dt2;
    }
    //Reset
    private void button3_Click(object sender, EventArgs e)
    {
        //dataGridView1.DataSource = ds1.Tables[0];
        dataGridView1.DataSource = bs1;
    }
}

xml模式:

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns=""      xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true"    msdata:MainDataTable="row" msdata:UseCurrentLocale="true">
  <xs:complexType>
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="row">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="col1" type="xs:string" minOccurs="1" />
          <xs:element name="col2" type="xs:string" minOccurs="1" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

xml文件

<?xml version="1.0" encoding="utf-8" ?>
<DocumentElement>
 <row>
   <col1>X11</col1>
   <col2>X12</col2>
 </row>
 <row>
   <col1>X21</col1>
   <col2>X22</col2>
 </row>
</DocumentElement>