C# 为什么在试图通过Gridview更新/删除一行时会删除XML文件中的所有数据?

C# 为什么在试图通过Gridview更新/删除一行时会删除XML文件中的所有数据?,c#,asp.net,xml,gridview,C#,Asp.net,Xml,Gridview,我有一个可编辑的Gridview,它在XML文件中运行。当我试图通过Gridiview更新/删除一行时,XML文件中的所有数据都会被删除。插入新行时,挂起的数据将与新行一起替换。我能告诉你我做错了什么吗?我提供了xml文件和用于编辑GridView的四种方法 XML: <root> <pos> <partNumbers> <partid>0</partid> <

我有一个可编辑的Gridview,它在XML文件中运行。当我试图通过Gridiview更新/删除一行时,XML文件中的所有数据都会被删除。插入新行时,挂起的数据将与新行一起替换。我能告诉你我做错了什么吗?我提供了xml文件和用于编辑GridView的四种方法

XML:

<root>
    <pos>
        <partNumbers>
            <partid>0</partid>
            <partnumber>796542</partnumber>
        </partNumbers>
        <partNumbers>
            <partid>1</partid>
            <partnumber>225614</partnumber>
        </partNumbers>
        <partNumbers>
            <partid>2</partid>
            <partnumber>123457</partnumber>
        </partNumbers>
    </pos>
</root>

我可以看出您正在将数据表保存到xml文件,这是错误的:

    DataTable dtUpdateXMLFile = (DataTable)gvPartNumber.DataSource;
    dtUpdateXMLFile.Rows[index]["partid"] = partId;
    dtUpdateXMLFile.Rows[index]["partnumber"] = partNumber;
    dtUpdateXMLFile.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
请记住,此表仅来自xml文件的一部分(还有另一个表pos)。实际上,您必须保存数据集,而不是此表。首先将表更新到数据集,然后保存它。您的方法可能如下所示:

//Delete
protected void gvPartNumber_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    BindGridView();
    DataSet dsgvPartNumber = new DataSet();
    dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    dsgvPartNumber.Tables["partNumbers"].Rows[gvPartNumber.Rows[e.RowIndex].DataItemIndex].Delete();
    dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    BindGridView();

}

//Update GridView
protected void gvPartNumber_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int index = gvPartNumber.Rows[e.RowIndex].DataItemIndex;
    string partId = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartID")).Text;
    string partNumber = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartNumber")).Text;
    gvPartNumber.EditIndex = -1;
    BindGridView();

    DataSet dsgvPartNumber = new DataSet();
    dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    dsgvPartNumber.Tables["partNumbers"].Rows[index]["partid"] = partId;
    dsgvPartNumber.Tables["partNumbers"].Rows[index]["partnumber"] = partNumber;
    dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    BindGridView();

}

//Insert New Row
protected void gvPartNumber_RowCommand(object sender, GridViewCommandEventArgs e)
{

    if (e.CommandName == "insertXMLData")
    {
        string partid = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartIDInsert")).Text;
        string partnumber = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartNumberInsert")).Text;
        BindGridView();
        DataTable dtXMLInsert = (DataTable)gvPartNumber.DataSource;

        DataSet dsgvPartNumber = new DataSet();
        dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
        DataRow drInsert = dsgvPartNumber.Tables["partNumbers"].NewRow(); 
        drInsert["partid"] = partid;
        drInsert["partnumber"] = partnumber;
        dsgvPartNumber.Tables["partNumbers"].Rows.Add(drInsert);
        dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
        BindGridView();

    }
}

我可以看出您正在将数据表保存到xml文件,这是错误的:

    DataTable dtUpdateXMLFile = (DataTable)gvPartNumber.DataSource;
    dtUpdateXMLFile.Rows[index]["partid"] = partId;
    dtUpdateXMLFile.Rows[index]["partnumber"] = partNumber;
    dtUpdateXMLFile.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
请记住,此表仅来自xml文件的一部分(还有另一个表pos)。实际上,您必须保存数据集,而不是此表。首先将表更新到数据集,然后保存它。您的方法可能如下所示:

//Delete
protected void gvPartNumber_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    BindGridView();
    DataSet dsgvPartNumber = new DataSet();
    dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    dsgvPartNumber.Tables["partNumbers"].Rows[gvPartNumber.Rows[e.RowIndex].DataItemIndex].Delete();
    dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    BindGridView();

}

//Update GridView
protected void gvPartNumber_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int index = gvPartNumber.Rows[e.RowIndex].DataItemIndex;
    string partId = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartID")).Text;
    string partNumber = ((TextBox)gvPartNumber.Rows[e.RowIndex].FindControl("txtPartNumber")).Text;
    gvPartNumber.EditIndex = -1;
    BindGridView();

    DataSet dsgvPartNumber = new DataSet();
    dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    dsgvPartNumber.Tables["partNumbers"].Rows[index]["partid"] = partId;
    dsgvPartNumber.Tables["partNumbers"].Rows[index]["partnumber"] = partNumber;
    dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
    BindGridView();

}

//Insert New Row
protected void gvPartNumber_RowCommand(object sender, GridViewCommandEventArgs e)
{

    if (e.CommandName == "insertXMLData")
    {
        string partid = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartIDInsert")).Text;
        string partnumber = ((TextBox)gvPartNumber.FooterRow.FindControl("txtPartNumberInsert")).Text;
        BindGridView();
        DataTable dtXMLInsert = (DataTable)gvPartNumber.DataSource;

        DataSet dsgvPartNumber = new DataSet();
        dsgvPartNumber.ReadXml(Server.MapPath("~/xml/storeUserInfo.xml"));
        DataRow drInsert = dsgvPartNumber.Tables["partNumbers"].NewRow(); 
        drInsert["partid"] = partid;
        drInsert["partnumber"] = partnumber;
        dsgvPartNumber.Tables["partNumbers"].Rows.Add(drInsert);
        dsgvPartNumber.WriteXml(Server.MapPath("~/xml/storeUserInfo.xml"));
        BindGridView();

    }
}

逐步完成代码。您可能正在向xml文件或其他文件写入一个空字符串。找出它为什么是空的。。。您尝试过哪些诊断工作?我看不出有。放置
dtxmlsert.AcceptChanges()
before
dtxmlsert.WriteXml
帮助?标题中不需要标记。请阅读以了解更多信息。逐步完成代码。您可能正在向xml文件或其他文件写入一个空字符串。找出它为什么是空的。。。您尝试过哪些诊断工作?我看不出有。放置
dtxmlsert.AcceptChanges()
before
dtxmlsert.WriteXml
帮助?标题中不需要标记。请阅读了解更多信息。非常感谢您指出我做错了什么,并对我的解释表示感谢。它现在可以运行了,再次感谢。非常感谢你指出我做错了什么,并解释了原因。现在可以用了,再次感谢。