【问题标题】:GridView's NewValues and OldValues empty in the OnRowUpdating eventGridView 的 NewValues 和 OldValues 在 OnRowUpdating 事件中为空
【发布时间】:2010-03-12 01:12:43
【问题描述】:

我有下面的 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>

【问题讨论】:

    标签: asp.net gridview asp.net-3.5


    【解决方案1】:

    我不确定这是否会有所帮助..但这是我在 msdn site 中找到的内容

    仅当使用 DataSourceID 属性将 GridView 控件绑定到数据时,才会自动填充 Keys、OldValues 和 NewValues 集合。

    【讨论】:

    • 那么您是说只有在 aspx 页面上定义和使用数据源时才能使用这些值?
    • 我不确定,因为我没有尝试过,但声明说您需要使用 DataSourceID 属性与 GridView 绑定。我可能会尝试一下,看看您是否可以为数据源分配一个 ID 并将其绑定到后面的代码中。如果没有,我会尝试下面的建议 =)
    【解决方案2】:

    关于 GridView 控件的 RowUpdating 事件问题,它是 预期的行为,因为当我们这样做时 不关联 GridView(或其他 ASP.NET 2.0 数据绑定控件)与 DataSource 控件,它不会 自动查询并填写 参数集合 更新/删除/...事件。在这样的 情况下,我们需要手动提取 模板中的字段值 控制。

    这是here 中的一位微软员工所说的。

    在这种情况下,您可以使用 ExtractValuesFromCell 方法自己创建 NewValues 集合。

    编辑:

    this博客的cmet中找到一段代码:

    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
    }
    

    没有测试过,但似乎可以解决问题,如果解决了请告诉我。

    【讨论】:

    • 尝试使用 e.Keys 代替 gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell,
    • 在我的例子中,手动单元格值提取没有改变任何东西:NewValues 集合仍然是空的。
    【解决方案3】:

    我在 Page_Load 事件中进行数据绑定,当我单击“更新”时,PostBack 完成,Page_Load 事件也被触发。 GridView 再次填充了旧值,因此在 myGrid.RowUpdating 事件中我无法检索新值。如果这有帮助

    【讨论】:

      【解决方案4】:

      像这样在页面 PreRender 事件处理程序中绑定:

      Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
          GridBinder()
      End Sub
      

      注意:PreRender 发生在 RowUpdating 事件之后。

      【讨论】:

        【解决方案5】:

        您需要检查表单加载中的 IsPostback。当 gridview 的 Update 进行回发时,它首先用旧值刷新。使用 IsPostback 来防止这种情况:

        If Not IsPostback Then 
        
           ' Data bind here
        
        End If
        

        这样,它不会覆盖“新”gridview 值

        【讨论】:

        • 这并不能解释为什么 old values 为空,因此不是问题的解决方案。然而,随意重新绑定网格是一个常见的错误。
        猜你喜欢
        • 2019-04-26
        • 2011-09-04
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多