Попробуйте изменить код следующим образом:
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, этот код не работает,Я посмотрел на метод HandleUpdate GridView и обнаружил, что эти коллекции (e.NewValues и e.OldValues) заполняются только тогда, когда Gridview привязан к DataSourceControl через свойство DataSourceID ... Возможное решение - использовать ExtractValuesFromCell метод:
cell = GridView1.Rows[e.RowIndex].Cells[1] as DataControlFieldCell;
GridView1.Columns[1].ExtractValuesFromCell(
e.NewValues,
cell,
DataControlRowState.Edit,
true);
ПРИМЕЧАНИЕ: метод Page_Load должен иметь код, как я предлагал, т.е. DataBind должен вызываться только один раз.