Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows窗体中选择并更新数据表_C#_Xml_Winforms_Datagridview_Datatable - Fatal编程技术网

C# 在Windows窗体中选择并更新数据表

C# 在Windows窗体中选择并更新数据表,c#,xml,winforms,datagridview,datatable,C#,Xml,Winforms,Datagridview,Datatable,XML 1. 艺术家1 他的相册 C://music//song.mp3 2. 艺术家1 他的相册 C://music//song2.mp3 3. 艺术家1 他的相册 C://music//song2.mp3 DataSet dsStore=新数据集(); DataTable dt=新的DataTable(); 公共void loadXmlTracks() { //TrackCollection tracks=null; 字符串路径=“../../../../../../test.xml”;

XML


1.
艺术家1
他的相册
C://music//song.mp3
2.
艺术家1
他的相册
C://music//song2.mp3
3.
艺术家1
他的相册
C://music//song2.mp3
DataSet dsStore=新数据集();
DataTable dt=新的DataTable();
公共void loadXmlTracks()
{
//TrackCollection tracks=null;
字符串路径=“../../../../../../test.xml”;
//XmlSerializer serializer=新的XmlSerializer(typeof(TrackCollection));
//StreamReader=新的StreamReader(路径);
//tracks=(TrackCollection)序列化程序。反序列化(reader);
//reader.Close();
ReadXml(路径);
dt=dsStore.Tables[“Track”];
//最后将数据绑定到网格
负荷网格(dt);
}
私有void dataGridView1_CellEndEdit(对象发送方,DataGridViewCellEventArgs e)
{
int i;
int j;
i=e.RowIndex;
j=e.柱状指数;
字符串id=dataGridView1.Rows[i]。单元格[0]。值。ToString();
字符串值=dataGridView1.Rows[i].Cells[j].value.ToString();
DataRow[]row=dt.选择(“Id=”+i,“Id”);
foreach(第行中的数据行r)
{
r[j]=值;
r、 接受变化();
}
公共无效荷载网格(数据表dt)
{
dataGridView1.DataSource=null;
dataGridView1.DataSource=dt;
}
编辑:这是我正在加载的xml文件,然后我将其插入到datatable中,然后我使用该datatable加载我的datagridview。我想完成的是,如果用户编辑datagridview中的单元格以更新我datatable中的该行,那么当我关闭应用程序时,它会保存回xml文件

我不确定也不明白的是,如何将更改保存回我的Datatable,如果我有需要更改的行的ID,那么执行循环是否正确


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

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

  • 当您调用“AcceptChanges”时,您会将行更改的行状态从Changed、added…更改为unchanged,因此“DataAdapter”的upadte命令无法在“datatable”中找到更改记录,并且您的更改不会应用于数据库
  • 如果您知道自己的Id,并且Id是datatable中的primery键,那么您可以使用“dt.Rows.Find(i)”,它将为您提供所需的具有Id的datarow
  • 但是,如果您的data gridview绑定到datatable,那么当您更改一个单元格时,不必执行此操作这些更改将应用到datatable,唯一的问题是,当您更改一个单元格时,更改将不会应用到datatable,直到您从一行移动到另一行

    编辑: 删除函数“dataGridView1\u CellEndEdit”并添加表单关闭事件handler,如下所示:

    <?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;
        }
    

    AcceptChanges只是我在尝试的东西,如果最终结果是我所需要的,那么代码中的任何东西都可以更改。在更改网格中的单元格值时,我想要更改datatable的原因是,每当应用程序关闭时,它都会更新打开时读取的xml。因此,我必须始终检查datatable
    private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
                   string path = "..//..//..//test.xml";
                   dataGridView1.EndEdit();
                   if(dsStore.GetChanges()!=null)
                   {
                       dsStore.WriteXml(path);
                   }
    
    
    }