从gridview更新数据表时发生System.ArgumentOutOfRangeException

时间:2014-11-19 05:59:51

标签: c# asp.net exception gridview datatable

我正在使用Rowcommand事件更新网格视图中的行以及DataTable,但是在将值分配给DataTable中的行时会发生异常。

 protected void grduser_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {
            DataTable dt = (DataTable)ViewState["dtable"];

            Int32 index = Convert.ToInt32(e.CommandArgument);

            GridViewRow row = grduser.Rows[index];
           // after this statement the exception occurs!
            dt.Rows[row.DataItemIndex]["userid"] = ((TextBox)(row.Cells[0].Controls[0])).Text;
            dt.Rows[row.DataItemIndex]["username"] = ((TextBox)(row.Cells[1].FindControl("txtuname"))).Text;
            dt.Rows[row.DataItemIndex]["usertype"] = ((TextBox)(row.Cells[2].Controls[0])).Text;
            dt.Rows[row.DataItemIndex]["email"] = ((TextBox)(row.Cells[3].Controls[0])).Text;
            dt.Rows[row.DataItemIndex]["salary"] = ((TextBox)(row.Cells[4].FindControl("txtsalary"))).Text;
            grduser.EditIndex = -1; 
            ViewState["dtable"]=dt;
            grduser.DataSource = (DataTable)(ViewState["dtable"]);
            grduser.DataBind();

        }

    }

//下面的网格视图源。

       <asp:GridView ID="grduser" runat="server" AutoGenerateColumns="False" 
        onrowediting="grduser_RowEditing"   onrowupdating="grduser_updateRow"
         >

<Columns>
<asp:BoundField   HeaderText="Id" DataField="userid"/>
    <asp:TemplateField HeaderText="Name">
        <EditItemTemplate>
            <asp:TextBox ID="txtuname" runat="server" Text='<%# Bind("username") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Label1" runat="server" Text='<%# Bind("username") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
 <asp:BoundField HeaderText="User Type" DataField="usertype" />
 <asp:BoundField HeaderText="Email" DataField="email" />
    <asp:TemplateField HeaderText="Salary">
        <EditItemTemplate>
            <asp:TextBox ID="txtsalary" runat="server" Text='<%# Bind("salary") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Label2" runat="server" Text='<%# Bind("salary") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

                                                                                                                 

2 个答案:

答案 0 :(得分:0)

你可以尝试一下。

protected void grduser_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {
            DataTable dt = (DataTable)ViewState["dtable"];

            Int32 index = Convert.ToInt32(e.CommandArgument);

            GridViewRow row = grduser.Rows[index];

            dt.Rows[row.DataItemIndex]["userid"] = row.Cells[0].Text;
            dt.Rows[row.DataItemIndex]["username"] = ((TextBox)(row.FindControl("txtuname"))).Text;
            dt.Rows[row.DataItemIndex]["usertype"] = row.Cells[2].Text;
            dt.Rows[row.DataItemIndex]["email"] = row.Cells[3].Text;
            dt.Rows[row.DataItemIndex]["salary"] = ((TextBox)(row.FindControl("txtsalary"))).Text;
            grduser.EditIndex = -1; 
            ViewState["dtable"]=dt;
            grduser.DataSource = (DataTable)(ViewState["dtable"]);
            grduser.DataBind();

        }

    }

答案 1 :(得分:0)

您收到该错误是因为e.CommandArgument不是您GridView的有效行号。例如,您的grduser有3行而e.CommandArgument设置为3.这将抛出System.ArgumentOutOfRangeException,因为grduser.Rows基于0,您最有可能设置它从1开始。