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 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属性MISSGridView将再次与原始值绑定(刷新)。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");
   }