我用linq操作xml,在编辑保存的时候出现这个问题这是什么原因造成的呢?
我的代码:using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using CM = System.Configuration.ConfigurationManager;
using System.Collections.Generic;public partial class admin_photoflashadmin : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.BindXml();
        }
    }
    private void BindXml()
    {
        XDocument doc = XDocument.Load(this.Server.MapPath("../xml/viewerData.xml"));
        this.GridView1.DataSource=from p in doc.Root.Elements("item")
        select new
        {
              ID=p.Attribute("id").Value,
              title=p.Attribute("title").Value,
              img=p.Attribute("img").Value,
              url=p.Attribute("url").Value,
              target=p.Attribute("target").Value
        };
        this.GridView1.DataBind();
    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        XDocument doc = XDocument.Load(this.Server.MapPath("../xml/viewerData.xml"));
        var emp = (from p in doc.Root.Elements("item") where p.Attribute("id").Value == this.GridView1.DataKeys[e.RowIndex].Value.ToString() select p).Single();
        //设定各项属性
        emp.SetAttributeValue("title", Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("TextBox1") as TextBox).Text));
        emp.SetAttributeValue("img", Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("TextBox2") as TextBox).Text));
        emp.SetAttributeValue("url", Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("TextBox3") as TextBox).Text));
        emp.SetAttributeValue("target", Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("TextBox4") as TextBox).Text));
        //保存XML文档
        doc.Save(this.Server.MapPath("../xml/viewerData.xml"));
        this.GridView1.EditIndex = -1;
        //数据绑定
        this.BindXml();
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        this.GridView1.EditIndex = e.NewEditIndex;
        this.BindXml();
    }
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        this.GridView1.EditIndex = -1;
        this.BindXml();
    }
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        //加载XML文档
        XDocument doc = XDocument.Load(this.Server.MapPath("../xml/viewerData.xml"));
        var emp = (from p in doc.Root.Elements("item") where p.Attribute("id").Value == this.GridView1.DataKeys[e.RowIndex].Value.ToString() select p).Single();
        //移除节点
        emp.Remove();
        //保存XML文档
        doc.Save(this.Server.MapPath("../xml/viewerData.xml"));
        this.GridView1.EditIndex = -1;
        //数据绑定
        this.BindXml();
    }
}
<%@ Page Language="C#" MasterPageFile="~/admin/admin.master" AutoEventWireup="true" CodeFile="photoflashadmin.aspx.cs" Inherits="admin_photoflashadmin" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:GridView ID="GridView1" runat="server" OnRowUpdating="GridView1_RowUpdating" 
    CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" 
    OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowEditing="GridView1_RowEditing" DataKeyNames="id" OnRowDeleting="GridView1_RowDeleting">
        <Columns>
            <asp:BoundField DataField="id" HeaderText="编号" />
            <asp:TemplateField HeaderText="标题名称">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("title") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                 <%# Eval("title") %>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="图片链接">
            <ItemTemplate>
                 <%# Eval("img") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("img") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="文章链接">
            <ItemTemplate>
                 <%# Eval("url") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("url") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="弹出方式">
            <ItemTemplate>
                 <%# Eval("target") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("target") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowEditButton="True" />
            <asp:CommandField ShowDeleteButton="True" />
        </Columns>
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#999999" />
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    </asp:GridView>
</asp:Content>

解决方案 »

  1.   

    单步单步
    肯定就是那个index 超过界限了
      

  2.   

        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.GridView1.EditIndex = e.Item.ItemIndex;
            this.BindXml();
        }e.RowIndex都改成e.Item.ItemIndex试一下
      

  3.   

     var emp = (from p in doc.Root.Elements("item") where p.Attribute("id").Value == this.GridView1.DataKeys[e.RowIndex].Value.ToString() select p).Single();
    获取主键那
      

  4.   

    那不是 设有吗?   DataKeyNames="id"
      

  5.   


    打一断点调试一下就知道问题在哪了。。开发时把try...catch加上。。更容易快速找到错误
      

  6.   

    LZ可以考虑换一下事件度试
     OnCancelCommand="DataGrid1_CancelCommand" OnDeleteCommand="DataGrid1_DeleteCommand" OnEditCommand="DataGrid1_EditCommand" OnUpdateCommand="DataGrid1_UpdateCommand" onitemdatabound="DataGrid1_ItemDataBound"