为什么我得到GridViewUpdateEventArgs#NewValues和GridViewUpdateEventArgs#OldValues为空?

我绑定GridView就像 –

namespace grid_edit { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { SqlConnection con = new SqlConnection(); con.ConnectionString = "Data source=HP_OWNER\\SQLEXPRESS;Database=demo;Integrated security=true"; con.Open(); SqlCommand cmd = new SqlCommand("select * from demo", con); cmd.ExecuteNonQuery(); SqlDataAdapter mySqlAdapter = new SqlDataAdapter(cmd); DataSet myDataSet = new DataSet(); mySqlAdapter.Fill(myDataSet); DataTable myDataTable = myDataSet.Tables[0]; GridView1.DataSource = myDataTable; GridView1.DataBind(); Session["mytable"] = myDataTable; } protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; GridView1.DataBind(); } protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { String updatedItem = e.NewValues[0].ToString(); String anotherUpdatedItem = e.NewValues[1].ToString(); } } } 

并且标记如下 –

        

现在我想从网格视图更新行,但在更新事件GridViewUpdateEventArgs我得到NewValues和OldValues为空。
如何获取要存储在数据库中的更新值? 我在这里做错了吗?

尝试更改代码如下:

 protected void Page_Load(object sender, EventArgs e) { SqlConnection con = new SqlConnection(); con.ConnectionString = "Data source=(local);Database=northwind;Integrated security=true"; con.Open(); SqlCommand cmd = new SqlCommand("select * from Categories", con); cmd.ExecuteNonQuery(); SqlDataAdapter mySqlAdapter = new SqlDataAdapter(cmd); DataSet myDataSet = new DataSet(); mySqlAdapter.Fill(myDataSet); DataTable myDataTable = myDataSet.Tables[0]; GridView1.DataSource = myDataTable; if(!IsPostBack) /// <<<<<<<<<<<<<<<<<<<<<< GridView1.DataBind(); Session["mytable"] = myDataTable; } 

它适用于.NET Framework 4。

由于您使用的是.NET Framework 3.0,因此该代码不起作用。 我查看了GridView的HandleUpdate方法,发现只有当Gridview通过DataSourceID属性绑定到DataSourceControl时才会填充这些集合(e.NewValues和e.OldValues)...可能的解决方案是使用ExtractValuesFromCell方法:

  cell = GridView1.Rows[e.RowIndex].Cells[1] as DataControlFieldCell; GridView1.Columns[1].ExtractValuesFromCell( e.NewValues, cell, DataControlRowState.Edit, true); 

注意:Page_Load方法应该具有我建议的代码,即DataBind应该只调用一次。