【问题标题】:Select and Update DataTable in Windows Forms在 Windows 窗体中选择和更新 DataTable
【发布时间】:2012-01-18 18:36:10
【问题描述】:

XML

<?xml version="1.0" encoding="utf-8"?>
<TrackCollection>
  <Tracks>
      <Id>1</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song.mp3</Filepath>
      <Id>2</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song2.mp3</Filepath>
      <Id>3</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song2.mp3</Filepath>

  </Tracks>
</TrackCollection>

 DataSet dsStore = new DataSet();
 DataTable dt = new DataTable();
 public void loadXmlTracks()
    {
        //TrackCollection tracks = null;
        string path = "..//..//..//test.xml";

        //XmlSerializer serializer = new XmlSerializer(typeof(TrackCollection));

        //StreamReader reader = new StreamReader(path);
        //tracks = (TrackCollection)serializer.Deserialize(reader);
        //reader.Close();
        dsStore.ReadXml(path);
        dt = dsStore.Tables["Track"];

        // finally bind the data to the grid
        LoadGrid(dt);


    }

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    int i;
    int j;

    i = e.RowIndex;
    j = e.ColumnIndex;

    string id = dataGridView1.Rows[i].Cells[0].Value.ToString();
    string value = dataGridView1.Rows[i].Cells[j].Value.ToString();

    DataRow[] row = dt.Select("Id=" + i, "Id");
    foreach (DataRow r in row)
    {
        r[j] = value;
        r.AcceptChanges();
    }

public void LoadGrid(DataTable dt)
    {
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = dt;
    }

编辑:这是我正在加载的 xml 文件,然后我将其插入数据表,然后我使用该数据表加载我的 datagridview。我想要完成的是,如果用户编辑 datagridview 中的单元格以更新我的数据表中的该行,那么当我关闭应用程序时,它会保存回 XML 文件。

我不确定也无法弄清楚如何将更改保存回我的数据表,如果我有需要更改的行的 ID,执行循环是否正确?

我尝试了 RowFilter 并进行了更改,但是当我重新加载我的 datagridview 时,它只显示我更改的行..

【问题讨论】:

    标签: c# xml winforms datagridview datatable


    【解决方案1】:

    在您的代码中,我看到了一些注释:

    1. 当您调用“AcceptChanges”时,您将行更改的行状态从 Changed, added,... 更改为未更改,因此“dataadaptor”的 upadte 命令无法在“datatable”中找到更改记录,并且您的更改不适用于数据库。
    2. 如果您知道自己的 ID,并且 ID 是数据表中的主键,那么您可以使用“dt.Rows.Find(i)”,它会为您提供所需 ID 的数据行

    但是,如果您的数据网格视图绑定到您的数据表,则当您更改一个单元格时,这些更改将应用​​于您的数据表,唯一的事情是,当您更改一个单元格时,更改将不适用于您的数据表数据表,直到您从一行移动到另一行。

    编辑: 删除函数“dataGridView1_CellEndEdit”并添加表单关闭事件处理程序,如下所示:

    private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
                   string path = "..//..//..//test.xml";
                   dataGridView1.EndEdit();
                   if(dsStore.GetChanges()!=null)
                   {
                       dsStore.WriteXml(path);
                   }
    
    
    }
    

    【讨论】:

    • AcceptChanges 只是我正在尝试的东西,如果最终结果是我需要的,则可以更改该代码中的任何内容。我想在更改网格中的单元格值时更改数据表的原因是,每当应用程序关闭时,它都会更新它打开时读取的 xml。所以我必须一直检查数据表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多