我有下面的GridView。我绑定到后面的代码中的自定义数据源。它进入“OnRowUpdating”事件就好了,但没有NewValues或OldValues。关于如何获得这些价值的任何建议?
<asp:GridView ID="gv_Personnel"
runat="server"
OnRowDataBound="gv_Personnel_DataBind"
OnRowCancelingEdit="gv_Personnel_CancelEdit"
OnRowEditing="gv_Personnel_EditRow"
OnRowUpdating="gv_Personnel_UpdateRow"
AutoGenerateColumns="false"
ShowFooter="true"
DataKeyNames="BudgetLineID"
AutoGenerateEditButton="true"
AutoGenerateDeleteButton="true"
>
<Columns>
<asp:BoundField HeaderText="Level of Staff" DataField="LineDescription" />
<%--<asp:BoundField HeaderText="Hrs/Units requested" DataField="NumberOfUnits" />--%>
<asp:TemplateField HeaderText="Hrs/Units requested">
<ItemTemplate>
<%# Eval("NumberOfUnits")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="tb_NumUnits" runat="server" Text='<%# Bind("NumberOfUnits")%>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Hrs/Units of Applicant Cost Share" DataField="" NullDisplayText="0" />
<asp:BoundField HeaderText="Hrs/Units of Partner Cost Share" DataField="" NullDisplayText="0" />
<asp:BoundField FooterStyle-Font-Bold="true" FooterText="TOTAL PERSONNEL SERVICES:" HeaderText="Rate" DataFormatString="{0:C}" DataField="UnitPrice" />
<asp:TemplateField HeaderText="Amount Requested" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Applicant Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Partner Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Total Projet Cost" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
</Columns>
</asp:GridView>
答案 0 :(得分:5)
我不确定这是否会有所帮助..但这是我在msdn site
中找到的只有在使用DataSourceID属性将GridView控件绑定到数据时,才会自动填充Keys,OldValues和NewValues集合。
答案 1 :(得分:4)
关于GridView控件 RowUpdating事件问题,它是 预期的行为,因为我们这样做 不关联GridView(或其他 用ASP.NET 2.0数据绑定控件) DataSource控件,它不会 自动查询并填写 参数集合 更新/删除/ ...事件。在这样的 例如,我们需要手动提取 模板中的字段值 控制。
这就是here中的Microsoft员工所说的。
在这种情况下,您可以使用ExtractValuesFromCell方法自行创建NewValues集合。
编辑:
我在this博客的评论中找到了一段代码:
protected void OnRowEditing(object sender, GridViewEditEventArgs e)
{
GridView gv = (GridView)sender;
gv.EditIndex = e.NewEditIndex;
gv.DataBind();
...
}
protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridView gv = (GridView)sender;
for (int i = 0; i < gv.Columns.Count; i++)
{
DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true);
}
// now you can use NewValues collection normally
}
没有对它进行过测试,但似乎解决了这个问题,如果有的话请告诉我。
答案 2 :(得分:2)
我在我的Page_Load事件中进行数据绑定,当我点击“更新”时,PostBack已经完成,因此触发了Page_Load事件。 GridView再次填充旧值,因此在myGrid.RowUpdating事件中,我无法检索新值。如果这有帮助
答案 3 :(得分:1)
在Page PreRender事件处理程序中绑定如下:
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
GridBinder()
End Sub
注意:PreRender发生在RowUpdating事件之后。
答案 4 :(得分:0)
您需要在表单加载中检查IsPostback。当gridview的Update执行回发时,它首先使用旧值刷新。使用IsPostback来防止这种情况:
If Not IsPostback Then
' Data bind here
End If
这样,它不会覆盖“新”gridview值