【问题标题】:ASP.NET Gridview OnUpdating event not updating decimal valueASP.NET Gridview OnUpdating 事件不更新十进制值
【发布时间】:2013-10-02 17:55:07
【问题描述】:

我有一个带有模板字段的 ASP.NET 4.5 gridview 控件,用于更新/插入/显示 3 列表中的值。因此有一个 onUpdating 事件来处理更新。

我的问题是,当我输入 0、0.0 或其他 0 排列时,十进制列不会更新。适用于正值或负值,并且其他可见列会更新。此外,在小数字段上插入 0 的新行似乎没有问题。

我该如何解决这个问题?

    <asp:GridView ID="PriceGroupGv" runat="server" AllowPaging="true" AllowSorting="true" DataSourceID="PriceGroupEds" DataKeyNames="Id" AutoGenerateColumns="false"
         ShowHeader="true" ShowHeaderWhenEmpty="false" ShowFooter="true" ItemType="Infrastructure.PricingGroup"
         CssClass="table table-bordered table-condensed table-striped" AlternatingRowStyle-BackColor="GhostWhite" OnRowUpdating="PriceGroupGv_RowUpdating">
        <EmptyDataTemplate>
            <table class="table table-bordered table-condensed table-striped">
                <tr>
                    <th>Name</th>
                    <th>Markup</th>
                    <th></th>
                </tr>
                <tr>
                    <td>
                        <asp:TextBox ID="NameTxt" runat="server" />
                        <asp:RequiredFieldValidator ID="NameRfv" runat="server" ControlToValidate="NameTxt" ValidationGroup="NewRowVg" ForeColor="Red">
                            *</asp:RequiredFieldValidator>
                    </td>
                    <td>
                        <asp:TextBox ID="MarkupTxt" runat="server"/>
                        <asp:RegularExpressionValidator ID="MarkupRxv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="NewRowVg" ValidationExpression="^(-)?\d+(\.\d\d)?$" ForeColor="Red">
                            #.#</asp:RegularExpressionValidator>
                        <asp:RequiredFieldValidator ID="MarkupRfv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="NewRowVg" ForeColor="Red">
                            *</asp:RequiredFieldValidator>
                    </td>
                    <td>
                        <asp:LinkButton ID="AddBtn" runat="server" Text="Add New" OnClick="AddBtn_Click" CommandArgument="EmptyData" CausesValidation="true"
                             ValidationGroup="NewRowVg"/>
                    </td>
                </tr>
            </table>
        </EmptyDataTemplate>
        <Columns>
            <asp:BoundField DataField="Id" Visible="false" />
            <asp:TemplateField HeaderText="Name">
                <ItemTemplate>
                    <asp:Label ID="NameLbl" runat="server" Text="<%# Item.Name %>" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="NameTxt" runat="server" Text="<%# Item.Name %>" />
                    <asp:RequiredFieldValidator ID="NameRfv" runat="server" ControlToValidate="NameTxt" ValidationGroup="EditRowVg" ForeColor="Red">
                        *</asp:RequiredFieldValidator>
                </EditItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="NameTxt" runat="server" />
                    <asp:RequiredFieldValidator ID="NameRfv" runat="server" ControlToValidate="NameTxt" ValidationGroup="NewRowVg" ForeColor="Red">
                        *</asp:RequiredFieldValidator>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Markup">
                <ItemTemplate>
                    <asp:Label ID="MarkupLbl" runat="server" Text="<%# Item.Markup %>" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="MarkupTxt" runat="server" Text="<%# Item.Markup %>"/>
                    <%--<asp:RangeValidator ID="MarkupRngv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="EditRowVg" Type="Double"
                        MaximumValue="999.9999" MinimumValue="-999.9999" ForeColor="Red">
                        #.##</asp:RangeValidator>
                    <asp:RegularExpressionValidator ID="MarkupRxv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="EditRowVg" ValidationExpression="^(-)?\d+(\.\d\d)?$" ForeColor="Red">
                        #.#</asp:RegularExpressionValidator>--%>
                    <asp:RequiredFieldValidator ID="MarkupRfv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="EditRowVg" ForeColor="Red">
                        *</asp:RequiredFieldValidator>
                </EditItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="MarkupTxt" runat="server"/>
                    <asp:RangeValidator ID="MarkupRngv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="NewRowVg"  Type="Double"
                        MaximumValue="999.9999" MinimumValue="-999.9999" ForeColor="Red">
                        #.##</asp:RangeValidator>
                    <%-- <asp:RegularExpressionValidator ID="MarkupRxv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="NewRowVg" 
                        ValidationExpression="^(-)?\d+(\.\d\d)?$" ForeColor="Red">
                        #.#</asp:RegularExpressionValidator>--%>
                    <asp:RequiredFieldValidator ID="MarkupRfv" runat="server" ControlToValidate="MarkupTxt" ValidationGroup="NewRowVg" ForeColor="Red">
                        *</asp:RequiredFieldValidator>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="EditBtn" runat="server" CommandName="Edit" Text="Edit" />
                    <asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete" Text="Delete" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:LinkButton ID="UpdateBtn" runat="server" CommandName="Update" Text="Update" CausesValidation="true" ValidationGroup="EditRowVg" />
                    <asp:LinkButton ID="CancelBtn" runat="server" CommandName="Cancel" Text="Cancel" />
                </EditItemTemplate>
                <FooterTemplate>
                    <asp:LinkButton id="AddBtn" runat="server" Text="Add New" OnClick="AddBtn_Click" CommandArgument="NotEmpty" CausesValidation="true" ValidationGroup="NewRowVg" />
                </FooterTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:EntityDataSource ID="PriceGroupEds" runat="server" EnableInsert="true" EnableDelete="true" EnableFlattening="false" EnableUpdate="true" EntitySetName="PricingGroups"
        ConnectionString="name=Entities" DefaultContainerName="Entities" />

代码隐藏:

    protected void PriceGroupGv_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow gvr = (sender as GridView).Rows[e.RowIndex];
        e.NewValues["Name"] = (gvr.FindControl("NameTxt") as TextBox).Text;
        e.NewValues["Markup"] = Decimal.Parse((gvr.FindControl("MarkupTxt") as TextBox).Text);

        PriceGroupGv.DataBind();
    }// end event

【问题讨论】:

  • 尝试将该值转储到 PriceGroupGv_RowUpdating 中的临时变量中。然后插入一个断点,并检查该变量得到了什么。也许对 MarkupTxt 的值做同样的事情,只是为了看看它的样子。
  • 值通过但 0 仍未更新到数据库。无论我将它们作为字符串还是十进制类型传递,这些值都会出现。

标签: c# asp.net gridview webforms


【解决方案1】:

已解决 - 使标记列在数据库和模型中为 Nullable。我还在 db 中将类型更改为 Float,在模型中将类型更改为 Double,但最终让它工作的是拥有可为空的属性。

如果其他人有更好的解决方案,我会欢迎任何其他答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2014-10-25
    相关资源
    最近更新 更多