【发布时间】:2013-01-21 08:51:52
【问题描述】:
我有以下 GridView:
<asp:GridView ID="gridCar" runat="server" RowStyle-ForeColor="Black" AllowSorting="true" OnSorting="gridCar_Sorting" AutoGenerateEditButton="true" OnRowEditing="gridCar_RowEditing" OnRowCancelingEdit="gridCar_RowCancelingEdit" OnRowUpdating="gridCar_RowUpdating" OnRowUpdated="gridCar_RowUpdated"></asp:GridView>
我想更新编辑按钮选择的行。问题是,如果我尝试在gridCar_RowUpdating 中执行此操作,e.NewValues 将不包含已编辑的值,而是包含旧值。
我四处搜索,发现我可能不得不使用onRowUpdated 事件,但是我遇到了另一个问题;这个事件根本没有被触发。我尝试在gridCar_RowUpdating 中设置e.Cancel = false,但这并不能解决问题。
GridView 绑定到 DataTable。
编辑:这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
public partial class _Default : Page
{
DataTable carsTable = new DataTable("cars");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
carsTable.Columns.Add("CarID");
carsTable.Columns.Add("CarRegNum");
carsTable.Columns.Add("CarModel");
carsTable.Columns.Add("CarType");
carsTable.Columns.Add("CarOwner");
carsTable.Rows.Add(1, "AAA-111", "Toyota", "Hatchback", "Matti");
carsTable.Rows.Add(2, "BBB-222", "Mercedes-Benz", "Van", "Keijo");
carsTable.Rows.Add(3, "CCC-333", "Renault", "Regular", "Matilda");
carsTable.AcceptChanges();
gridCar.DataSource = carsTable;
gridCar.DataBind();
}
}
protected string dataViewSortDirection(SortDirection direction)
{
switch (direction)
{
case SortDirection.Ascending:
return "ASC";
case SortDirection.Descending:
return "DESC";
default:
throw new ArgumentOutOfRangeException();
}
}
protected void gridCar_Sorting(object sender, GridViewSortEventArgs e)
{
gridCar.Sort(e.SortExpression, e.SortDirection);
// update GridView
gridCar.DataBind();
}
protected void gridCar_RowEditing(object sender, GridViewEditEventArgs e)
{
gridCar.EditIndex = e.NewEditIndex;
gridCar.DataBind();
}
protected void gridCar_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gridCar.EditIndex = -1;
gridCar.DataBind();
}
protected void gridCar_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
labelDebug.Text += "b";
//gridCar.EditIndex = -1;
//gridCar.DataBind();
}
protected void gridCar_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
labelDebug.Text += "a";
gridCar.EditIndex = -1;
gridCar.DataBind();
}
}
【问题讨论】:
-
在 ViewState 中存储数据表不是一个好习惯,因为它会增加页面大小并降低性能,而且 ViewState 可以在客户端被破译,因此 DataTable 不安全。
-
@TimSchmelter 在我的情况下你会建议我做什么?
-
正如我对我的回答所评论的那样,您不需要保留数据源,因为无论如何数据都存储在 GridView 的 ViewState 中。所以
e.OldValues和e.NewValues已设置,即使您没有将DataTable从服务器传输到客户端并返回到服务器。但是您需要确保它仅在第一次加载时才被数据绑定(!IsPostBack)。
标签: c# asp.net events gridview datatable