我有一个GridView需要在每一行中都有一个可编辑的列。我已将其声明如下所示。
GridViewTest_OnRowUpdating
数据显示应该是。尝试编辑百分比值时出现问题。单击“更新”工作正常,单元格中的可编辑TextBox会显示,但是当修改了值并单击“更新”时,当GridViewUpdateEventArgs
方法被点击时,对象发件人和 protected void GridViewTest_OnRowUpdating(object ASender, GridViewUpdateEventArgs AE)
{
PerformDataTableUpdate(ref TestGrid, AE);
}
都是空的。该方法定义如下。
GridViewUpdateEventArgs
在上述方法中;对象ASender没有行,Page_load
AE属性都是空的(键,NewValues,OlValues等)。
我确保GridView没有在Page_Load或其他任何地方反弹(当它进入和离开GridViewTest_OnRowUpdating
时它是空的,并且当它在更新回发时命中{{1}}时仍然是空的。)
非常感谢任何帮助。
答案 0 :(得分:3)
使用GridView更新值时,需要设置DataKeyNames
属性。一旦指定了这一点,Gridview就会使用唯一标识的键来更新/删除哪些行
DataKeyNames
通常设置为表的主键,但我们不一定总是这样做。
您必须设置DataKeyNames属性才能使GridView控件的自动更新和删除功能正常工作。这些关键字段的值将传递到数据源控件,以指定要更新或删除的行
编辑::
1。)GridViewUpdateEventArgs AE属性都是空的(Keys,NewValues,OlValues等)
现在有一个条件,即只有在使用DatakeyNames
属性绑定数据时,GridView才会使用DataSourceID
并填充Old
和New
值。这是设计的。
2。)对象ASender没有行
我怀疑这种情况正在发生,因为数据绑定到gridview没有以正确的方式完成。
以下是围绕此问题的一些常见讨论/解决方案::
1。)由于数据在运行时绑定到gridview,请确保按以下方式绑定它:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.DataSource = ds; // appropriate data source here
GridView1.DataBind();
}
}
为什么DataBind()采用上述方式? ::
点击"更新"按钮,
Page_Load()
事件在OnRowUpdating()
事件之前被触发。因此,如果您使用IsPostback
属性 MISS ,GridView
将再次使用原始值(即OldValues)进行绑定(刷新)
这是必需的,以便在我们的onRowUpdating
事件中获得我们之前提交的新值。
2。)从行获取值:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
TextBox FirstName= (TextBox)row.FindControl("txtFirstName");
}