在Windows窗体中选择并更新DataTable

时间:2011-12-12 19:40:27

标签: c# xml winforms datagridview datatable

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时它只显示我更改的行..

1 个答案:

答案 0 :(得分:1)

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

  1. 当你调用“AcceptChanges”时,你将行更改的rowstatus从Changed,添加,...更改为未更改因此upadte命令“dataadaptor”无法在“datatable”中找到更改记录,并且您的更改不适用于数据库中。
  2. 如果您知道您的ID和ID是数据表中的主键,那么您可以使用“dt.Rows.Find(i)”,它会为您提供您想要的id的数据行
  3. 但是如果您的数据gridview绑定到您的数据表,那么在更改一个单元格时没有必要这样做,这些更改将应用​​于您的数据表,唯一的是,当您更改一个单元格时,更改将不适用于您的数据表直到您从一行移动到另一行。

    编辑: 删除函数“dataGridView1_CellEndEdit”并添加表单结束事件hanlder,如下所示:

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