2014-11-19 3 views
0

Я обновляю строку в виде сетки, а также DataTable, используя событие Rowcommand, но возникает исключение при назначении значений строке в DataTable.System.ArgumentOutOfRangeException возникает при обновлении datatable из gridview

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

может быть здесь 'GridViewRow row = grduser.Rows [index]' –

+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(); 

     } 

    } 
+0

NOPE НЕ РАБОТАЕТ ДЛЯ БОЛЬШИХ ПОЛЕЙ! –

+0

Попробовали ли вы его отладить? Я несколько раз пробовал свою машину, и она работает. Вы уверены, что он не работает? – Chris

+0

Какая у вас ошибка? добро пожаловать. – Chris

0

Вы получаете эту ошибку, потому что ваш e.CommandArgument не является допустимым номером строки из вашего GridView. Например, ваш grduser имеет 3 строки и ваш e.CommandArgument установлен 3. Это будет бросать System.ArgumentOutOfRangeException потому что grduser.Rows является 0 на основе, и вы, скорее всего, установить его, начиная с 1.

+0

на самом деле не устанавливая его по своему выбору, я получаю индекс этой конкретной строки непосредственно при щелчке обновления. –

+0

@psylogic Я понимаю, что вы его нажимаете. Я говорю, что это было ранее неправильно настроено на первоначальное связывание, когда вы использовали e.CommandArgument. – ethorn10

+0

Итак, как мы можем решить эту проблему? потому что, насколько я знаю, строка вызывает событие, поэтому индекс должен быть этой строки. Просветите меня на этом, поскольку я более чем желаю знать лучше, хотя я решил проблему немного по-другому. –

Смежные вопросы