【问题标题】:How to repopulate datagridview with XML file如何使用 XML 文件重新填充 datagridview
【发布时间】:2016-11-03 01:14:25
【问题描述】:

我已经尝试过很多次搜索,但不幸的是我没有运气。我有一个应用程序,它允许您选择一个 COM 端口及其波特率,然后将其连接到另一个 COM 端口(因此信号进入一个端口并从另一个端口出来)。我有一个保存功能,可以将其保存为 XML 格式。

我希望能够打开该保存文件,以便 XML 文件中的所有信息都填充 datagridview,但是我找不到方法。

(在我的应用程序中使用基本设置)我在 Google Chrome 中打开 XML 文件,它看起来像这样(布局并不完美,但我可以稍后更改):

<Root_Element>
<Output_Port Output_Baud="9600">COM104</Output_Port>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM3</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM1</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM6</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM5</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM4</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is On" Baud="9600" Extract="12345" Data="">COM100</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM101</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is On" Baud="9600" Extract="" Data="">COM102</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM103</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM104</Serial_Port_Name>
<Serial_Port_Name Use="Checkbox is Off" Baud="9600" Extract="" Data="">COM105</Serial_Port_Name>
</Root_Element>

下面的代码是我保存数据的方式。我只是希望能够从根本上做相反的事情,并将数据放回它的来源。

private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
    {

        // Create the XmlDocument.
        XmlDocument doc = new XmlDocument();

        // Create root element.
        XmlElement rootElem = doc.CreateElement("Root_Element");
        doc.AppendChild(rootElem);

        // Add an "Output Port" element.                
        XmlElement outPortElem = doc.CreateElement("Output_Port");
        outPortElem.Value = (string)comboBox1.SelectedItem;
        rootElem.AppendChild(outPortElem);

        // Add an "Output Baud" Attribute.
        XmlAttribute outBaudAtt = doc.CreateAttribute("Output_Baud");
        outBaudAtt.Value = (string)comboBox2.SelectedItem;
        outPortElem.Attributes.Append(outBaudAtt);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            var ip_port2 = (SerialPort)row.Tag;

            // Write Serial Port Name element.
            XmlElement nameElem = doc.CreateElement("Serial_Port_Name");
            nameElem.Value = (string)row.HeaderCell.Value; // display the port name
            rootElem.AppendChild(nameElem);

            if (ip_port2.IsOpen == true) // if the ip_port is open
            {
                // Add a "Use" attribute.
                XmlAttribute useAtt = doc.CreateAttribute("Use");
                useAtt.Value = "Checkbox is On"; // display the port as "on"
                nameElem.Attributes.Append(useAtt);
            }
            else if (ip_port2.IsOpen != true) // if the ip_port is closed
            {
                // Add a "Use" attribute.
                XmlAttribute useAtt = doc.CreateAttribute("Use");
                useAtt.Value = "Checkbox is Off"; // display the port as "off"
                nameElem.Attributes.Append(useAtt);
            }

            // Add a "Baud" attribute.
            XmlAttribute baudAtt = doc.CreateAttribute("Baud");
            baudAtt.Value = (string)row.Cells[1].Value;
            nameElem.Attributes.Append(baudAtt);

            // Add an "Extract" attribute.
            XmlAttribute extractAtt = doc.CreateAttribute("Extract");
            extractAtt.Value = (string)row.Cells[2].Value;
            nameElem.Attributes.Append(extractAtt);

            // Add a "Data" attribute.
            XmlAttribute dataAtt = doc.CreateAttribute("Data");
            dataAtt.Value = (string)row.Cells[3].Value;
            nameElem.Attributes.Append(dataAtt);
        }

        // Save the document to a file. White space is preserved (no white space).
        doc.PreserveWhitespace = true;            
        doc.Save(saveFileDialog1.FileName);

任何帮助都会很棒!提前致谢!

【问题讨论】:

    标签: c# xml datagridview


    【解决方案1】:

    尝试使用DataSet/DataTable

    此代码读取您的 xml 文件:

    var ds = new DataSet();
    ds.ReadXml("filename.xml");
    

    现在DataSet 中有两个DataTable

    让我们从第一个获取值:

    var outputBaud = ds.Tables[0].Rows[0]["Output_Baud"];
    var outputPort = ds.Tables[0].Rows[0]["Output_Port_Text"];
    

    接下来,从第二个DataTable 开始填写DataGridView(注意!黑魔法!):

    dataGridView.DataSource = ds.Tables[1];
    

    很简单,不是吗?

    现在您可以编辑DataGridView 中的值。由于数据绑定,它们将存储在DataTable

    保存数据也很简单。

    ds.Tables[0].Rows[0]["Output_Baud"] = outputBaud;
    ds.Tables[0].Rows[0]["Output_Port_Text"] = outputPort;
    
    ds.WriteXml("filename.xml");
    

    您可以丢弃庞大的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2013-08-25
      • 2015-03-29
      相关资源
      最近更新 更多