GridView从抛出异常的代码更新

时间:2011-08-29 12:12:21

标签: c# asp.net gridview updating

我有一个GridView,其中包含客户端列表及其绑定到Sq1DataSource的详细信息。我想通过RowUpdating事件后面的代码更新它,通过逐个单元访问数据并将其发送到我的客户端BLL中的更新功能。这是代码:

   protected void gvClients_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        GridViewRow row = gvClients.Rows[e.RowIndex];
        //accesses Client Id
        cliIdStr = ((TextBox)(row.Cells[1].Controls[0])).Text;
        int cliId = int.Parse(cliIdStr);
        cliBll = new ClientBLL(conStrName);
        //Accesses client object from DB according to Client Id accessed from gridView
        client = cliBll.GetClient(cliId);
        if (client != null)
        {
            client.ClientName = ((TextBox)(row.Cells[2].Controls[0])).Text;
            client.Phone = ((TextBox)(row.Cells[3].Controls[0])).Text;
            client.EMail = ((TextBox)(row.Cells[4].Controls[0])).Text;
            client.Fax = ((TextBox)(row.Cells[5].Controls[0])).Text;
            client.Address = ((TextBox)(row.Cells[6].Controls[0])).Text;
            client.City = ((DropDownList)(row.Cells[7].Controls[0])).SelectedValue;
            client.ZipCode = ((TextBox)(row.Cells[8].Controls[0])).Text;
            client.IdNum = ((TextBox)(row.Cells[9].Controls[0])).Text;
            client.BusField = ((TextBox)(row.Cells[10].Controls[0])).Text;
            cliBll = new ClientBLL(conStrName);
            cliBll.UpdateClient(cliDtlShrt);
        }
    }

当我运行程序并按下GridView的编辑按钮时,一切都很好但是当我按下Uodate按钮时会抛出以下异常:

  

[ArgumentOutOfRangeException:指定的参数超出范围   有效值。参数名称:index]
  System.Web.UI.ControlCollection.get_Item(Int32 index)+8673806

指向代码中的这一行:

cliIdStr = ((TextBox)(row.Cells[1].Controls[0])).Text;

如果我正确理解了消息,问题出在Controls [0]中,但为什么呢?如何从gridView单元格访问数据以发送到正在更新?

1 个答案:

答案 0 :(得分:1)

您的代码失败,因为更新发生时,行提供编辑UI不再可用 - e.RowIndex处的行是一个普通的网格视图行,其单元格将根据列类型进行控制。因此,大多数单元格(例如BoundField列的单元格)内部都没有任何控制,因为单元格直接包含值 - 因此Controls[0]处的错误。

您需要使用GridViewUpdateEventArgs.NewValues属性来获取行的新值(非键列)。类似的关键列值将出现在e.Keys

编辑:我还建议您考虑使用ObjectDataSource代替SqlDataSource来简化您的生活 - 请参阅this article以帮助您入门。