GridView OnRowUpdating无法获取值
本文关键字:获取 OnRowUpdating GridView | 更新日期: 2023-09-27 18:12:36
我有一个GridView,需要在每一行有一个可编辑的列。我已经如下所示声明了。
<asp:GridView ID="TestGrid" runat="server" AllowPaging="true" SkinID="GridViewNew" AllowSorting="False"
OnRowDataBound="GridViewTest_RowDataBound" EnableViewState="True"
OnRowUpdating="GridViewTest_OnRowUpdating" OnRowEditing="GridViewTest_OnRowEditing" OnRowCancelingEdit="GridViewTest_OnRowCancelingEdit"
AutoGenerateColumns="False">
<Columns>
<asp:CommandField ShowEditButton="True" CausesValidation="False" />
<asp:BoundField DataField="Client" HeaderText="Client" InsertVisible="False" ReadOnly="True" />
<asp:BoundField DataField="Stock" HeaderText="Stock" InsertVisible="False" ReadOnly="True" />
<asp:TemplateField HeaderText="DutyStatus" InsertVisible="False" >
<ItemTemplate>
<asp:Label ID="standLbl" runat="server"><%#Eval("DutyStatus").ToString().Trim() %></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="DdlDutyStatus" runat="server"
DataTextField="DutyStatus"
DataValueField="DutyStatus">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Percentage" InsertVisible="False" SortExpression="enhanced">
<ItemTemplate>
<asp:Label ID="enhLbl" runat="server"><%#Eval("percentage").ToString().Trim() %></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TbPercentage" runat="server" Text='<%#Eval("percentage").ToString().Trim()%>' class="edit-field"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
数据显示为应有的样子。在尝试编辑Percentage值时出现问题。点击"更新"可以正常工作,显示单元格内的可编辑文本框,但是当值被修改并点击"更新"时,当点击GridViewTest_OnRowUpdating
方法时,对象发送者和GridViewUpdateEventArgs
都是空的。方法定义如下:
protected void GridViewTest_OnRowUpdating(object ASender, GridViewUpdateEventArgs AE)
{
PerformDataTableUpdate(ref TestGrid, AE);
}
在上述方法中;对象发送器没有行,GridViewUpdateEventArgs
AE属性都是空的(键,NewValues, OlValues等)。我已经确保GridView不会在Page_Load或其他任何地方得到反弹(当它进入并离开Page_load
时为空,当它在更新回发时击中GridViewTest_OnRowUpdating
时仍然为空)。
使用GridView更新值时,需要设置 DataKeyNames
属性。一旦指定了这个,Gridview使用键来唯一地标识哪些行需要更新/删除
DataKeyNames
通常被设置为表的主键,但我们并不一定总是这样做。
MSDN说:
为了使GridView控件的自动更新和删除功能起作用,必须设置DataKeyNames属性。这些关键字段的值传递给数据源控件,以便指定要更新或删除的行
编辑::
1)。GridViewUpdateEventArgs AE属性都是空的(键,NewValues, OlValues等)
现在有一个条件,GridView将只使用DatakeyNames
和填充 Old
和 New
值只有当数据使用DataSourceID
属性绑定。这是故意的。
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() ?::
点击"Update"按钮后,
Page_Load()
事件在OnRowUpdating()
事件之前触发。因此,如果您使用IsPostback
属性MISS,GridView
将再次与原始值绑定(刷新)。OldValues)
这是必需的,以便在我们的onRowUpdating
事件中我们获得我们之前提交的New值。
2)。从行获取值:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
TextBox FirstName= (TextBox)row.FindControl("txtFirstName");
}