【问题标题】:DataGridView import .xml fileDataGridView 导入 .xml 文件
【发布时间】:2021-01-04 02:20:24
【问题描述】:

我无法弄清楚这一点,我已经尝试了好几个小时。 我正在尝试将 .xml 文件加载到我的 DataGridView 中。我已经设法将 DataGridColumn 保存到这样的 .xml 文件中:

SaveFileDialog savefile = new SaveFileDialog();
savefile.FileName = "Test.xml";
savefile.Filter = "xml files (*.xml)|*.xml";
    if (savefile.ShowDialog() == DialogResult.OK)
    {
        DataTable dT = GetDataTableFromDGV(dataGridView1);
        DataSet dS = new DataSet();
        dS.Tables.Add(dT);
        dS.WriteXml(File.OpenWrite(savefile.FileName));
    }

通过运行这些代码行,.xml 文件显示如下内容:

<NewDataSet>
  <Table1>
    <Column1>123235435</Column1>
    <Column2>dffg</Column2>
    <Column3>ghh</Column3>
    <Column4>N/A</Column4>
    <Column5>100k</Column5>
    <Column6>False</Column6>
    <Column7>False</Column7>
  </Table1>
  <Table1 />
</NewDataSet>

这很好用(我认为),但是当我尝试通过各种方法加载它时,它要么根本不加载它,要么我突然无法再以编程方式添加行。我希望在 Forms1_Load 事件中加载文件,并且希望能够再次将其保存到同一个文件中。

如果我不清楚并需要详细说明,请告诉我。在此先感谢:)

编辑:GetDataTableFromDGV 方法:

private DataTable GetDataTableFromDGV(DataGridView dataGridView1)
        {
            var dt = new DataTable();

            foreach (DataGridViewColumn column in dataGridView1.Columns)
            {
                if (column.Visible)
                {
                    dt.Columns.Add();
                }
            }

            object[] cellValues = new object[dataGridView1.Columns.Count];
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                for (int i = 0; i < row.Cells.Count; i++)
                {
                    cellValues[i] = row.Cells[i].Value;
                }
                dt.Rows.Add(cellValues);
            }

            return dt;


        }

【问题讨论】:

  • 因为您使用 DataSet 来存储数据:var ds = new DataSet(); ds.ReadXml([Your XML File Path]); [DataGridView].DataSource = ds.Tables[0];。这是你试过的吗?
  • @Jimi 抱歉回复晚了,但是是的,我尝试了类似的方法,它只添加了相应数量的行,但列中没有任何数据。我的意思是所有列都是空的,但它确实生成了 2 行。显然,我也希望填写这些列。我不知道是什么导致了这个问题。谢谢你的回答!
  • 因此,数据已加载(您有两个新行)。您是否检查了一些基本内容,例如 DGV DefaultCellStyle ForeColor 是否与 BackColor 相同(因此您无法看到文本。如果您单击单元格,它将显示)? -- 你能说明GetDataTableFromDGV(dataGridView1) 在做什么吗? (当您的代码中有相关方法时,您应该发布这些方法的主体)。
  • 当然,愚蠢的我不表现出来哈哈。我已将其添加到我的帖子中。此外,文本应该是可见的,因为颜色彼此不同。
  • 仅供参考,既然你说了,检查文件的内容,数据是存储的,如下所示。 1. 我建议这样写数据:[DataSet].WriteXml(savefile.FileName, XmlWriteMode.WriteSchema);:File.OpenWrite() 保持 Stream 打开而不关闭它。 2. 您应该使用 DataTable 作为 DGV 的 DataSource。如果要删除列(以避免隐藏的列?为什么?),DataTable 有Remove()RemoveAt() 方法。不要像那样使用object[],你最终会得到所有的字符串。到目前为止,您还保存了 NewRow 对象。

标签: c# xml visual-studio winforms datagridview


【解决方案1】:

代码似乎可以进行一些细微的更改,我不确定隐形列在做什么。如果代码最初从 XML 文件中读取数据,并且您将网格数据源设置为从 XML 文件中读取的数据,那么您使某些列不可见,然后代码“写”回网格数据” 到同一个 XML 文件中,同时“忽略”不可见的列,然后当您编写文件时,您将丢失您开始使用的不可见列。目前还不清楚不可见列是如何在这里发挥作用的,以及在“编写” XML 文件时是否真的需要它们。

此外,当代码在GetDataTableFromDGV 方法中从DataGridView 创建DataTable 时……我不确定为什么在创建DataTable 列时不使用网格中的列名。例如,代码中有一行……

dt.Columns.Add();

这是添加一个“空白”新列。第一个将具有默认名称“Column1”。是否有某种原因您没有在这里使用网格列名称?像……

dt.Columns.Add(column.HeaderText);

这会将DataTable 列名与网格的同名匹配。目前尚不清楚这是否是有意的。

最后,关于您在 cmets 中所说的内容......

“我似乎无法使用此解决方案以编程方式添加任何行。”

这取决于您尝试以编程方式添加行的“方式”。当网格有DataSource(在这种情况下显然是这样)时,如果网格允许,用户可以直接在网格中“添加/删除/编辑”单元格/行。用户在网格中所做的更改会在DataSource 中自动更改。这是设计使然。

但是,如果代码尝试以编程方式将行直接“添加/删除”到网格中,您将收到一条错误消息,指出您不能以编程方式将行添加到数据绑定网格中。如果您想“以编程方式”向网格添加一行,则必须将该行添加到DataSource。在这种情况下,DataTable。在代码中,不是将行添加到网格本身,而是将新行添加到DataTable,它将自动显示在网格中。

我希望这是有道理的。

【讨论】:

  • ds.WriteXml(savefile.FileName, XmlWriteMode.WriteSchema); 然后ds.ReadXml([File Path], XmlReadMode.ReadSchema);。这里不需要流,您只是读取/写入本地文件,而不是通过网络。很可能,默认编码可以保持原样。
  • @Jimi 感谢您提供的信息。我显然不精通 XML。当我使用独立线路时……ds.WriteXml(savefile.FileName, XmlWriteMode.WriteSchema)……它似乎使文件保持打开状态。我会在写入后尝试读取文件,并不断收到文件已被使用的错误消息。我做错了吗?
  • 该重载(带有文件路径和选项)使用XmlTextWriter(和阅读器),在操作完成后立即关闭(即使由于某种原因引发异常)。
  • @Jimi Wellll……废话。它现在工作正常。最初,我的印象是它会像你说的那样工作,但是错误不断出现。在我跳下那个兔子洞之前,我应该研究一下文档。我一定是累了,脾气暴躁。感谢您提供信息,我将在我的回答中删除该部分。
  • @Jimi Ahhh... 我想我知道我在哪里得到了错误。我正在使用发布的代码...dS.WriteXml(File.OpenWrite(savefile.FileName));,我会假设左开部分来自File.OpenWrite(…),正如你所说,这似乎没有必要。再次感谢。
【解决方案2】:

您可以尝试以下代码将xml文件转换为datagridview。

private void Form1_Load(object sender, EventArgs e)
        {
            string path = "E:\\test.xml";
            string str = File.ReadAllText(path);
            System.IO.StringReader sr = new System.IO.StringReader(str);
            DataSet ds = new DataSet();
            ds.ReadXml(sr);
            DataTable dt = new DataTable();
            dt = ds.Tables[0];
            dataGridView1.DataSource = dt;
        }

此外,我注意到您的 xml 文件有错误。请尝试以下 xml 文件。

<?xml version="1.0" encoding="UTF-8" ?>
<NewDataSet>
  <Table1>
    <Column1>123235435</Column1>
    <Column2>dffg</Column2>
    <Column3>ghh</Column3>
    <Column4>N/A</Column4>
    <Column5>100k</Column5>
    <Column6>False</Column6>
    <Column7>False</Column7>
  </Table1>
</NewDataSet>

测试结果:

最后,如果你想把datagirdview转成datatable。

你可以试试这样的代码:

  DataTable table = (DataTable)dataGridView1.DataSource;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多