You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确自定义ASP DataGrid Quantity列的数值显示格式?

问题:ASP DataGrid的Quantity列格式设置不生效

我在应用中使用了如下ASP DataGrid控件:

<asp:datagrid id="grdMaterial" runat="server" Width="100%" AutoGenerateColumns="False" AllowPaging="True"
    PageSize="4" onselectedindexchanged="grdMaterial_SelectedIndexChanged">
    <SelectedItemStyle CssClass="CTC_Grid_SelectedItem"></SelectedItemStyle>
    <Columns>
        <asp:TemplateColumn HeaderText="Material Category">
            <HeaderStyle Width="100px"></HeaderStyle>
            <ItemTemplate>
                <asp:LinkButton id="LinkButton1" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MATERIAL_CATEGORY") %>' CommandName="Select">
                </asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateColumn>
        <asp:BoundColumn DataField="MATERIAL_QTY" HeaderText="Quantity">
            <HeaderStyle Width="100px"></HeaderStyle>
        </asp:BoundColumn>
        
    </Columns>
    <PagerStyle HorizontalAlign="Right" Mode="NumericPages" PageButtonCount="5"></PagerStyle>
</asp:datagrid>

当前Quantity列的数值显示如下:

+----------+
| Quantity |
+----------+
| 89.124   |
+----------+
| 89.19    |
+----------+
| 89.1     |
+----------+
| 89       |
+----------+
| 89.56    |
+----------+

我需要将其修改为如下显示格式:

+----------+
| Quantity |
+----------+
| 89.1240  |
+----------+
| 89.19    |
+----------+
| 89.10    |
+----------+
| 89       |
+----------+
| 89.56    |
+----------+

我尝试设置BoundColumn的DataFormatString属性,代码如下:

<asp:BoundColumn DataField="MATERIAL_QTY" HeaderText="Quantity" HeaderStyle-Width="100px" DataFormatString="{0:0.####;-0.####;''}"></asp:BoundColumn>

以及:

<asp:BoundColumn DataField="MATERIAL_QTY" HeaderText="Quantity" HeaderStyle-Width="100px" DataFormatString="{0:0.####0;0.##;0}"></asp:BoundColumn>

但以上设置均未生效,请问该如何解决此问题?


解决办法

为啥之前的设置没用?

ASP.NET的BoundColumn里的DataFormatString只有当绑定的字段是数值类型(比如decimal、float)时才会生效。如果你的MATERIAL_QTY存在数据库里是字符串类型,或者绑定前没转成数值,格式设置根本起不了作用。另外,全局配置强制开启HtmlEncode的情况也可能影响格式生效,但比较少见。

办法1:先把字段转成数值类型

先检查你的数据源:

  • 如果是从数据库查询的结果,直接在SQL语句里把字段转成数值,比如SELECT CAST(MATERIAL_QTY AS DECIMAL(18,4)) AS MATERIAL_QTY ...
  • 如果是代码里的实体集合,把实体类的MATERIAL_QTY属性改成decimal类型,绑定前确保是数值而非字符串。

不过单纯转成数值后,用DataFormatString无法实现你要的「整数不显示小数、小数补到4位」的效果,所以更推荐下面的办法2。

办法2:换成TemplateColumn手动写格式化逻辑

把原来的BoundColumn改成TemplateColumn,直接在模板里调用后台的格式化方法:

<asp:TemplateColumn HeaderText="Quantity">
    <HeaderStyle Width="100px"></HeaderStyle>
    <ItemTemplate>
        <%# FormatQty(Eval("MATERIAL_QTY")) %>
    </ItemTemplate>
</asp:TemplateColumn>

然后在后台代码(.aspx.cs文件)中添加格式化方法:

protected string FormatQty(object qtyValue)
{
    // 处理空值或空白内容
    if (qtyValue == null || string.IsNullOrWhiteSpace(qtyValue.ToString()))
        return "";
    
    // 尝试将内容转为decimal类型
    if (decimal.TryParse(qtyValue.ToString(), out decimal quantity))
    {
        // 判断是否为整数:整数直接显示数字,否则补到4位小数后去除末尾多余的0和点
        if (quantity == Math.Floor(quantity))
            return quantity.ToString("0");
        else
            return quantity.ToString("0.0000").TrimEnd('0').TrimEnd('.');
    }
    // 转换失败时返回原内容
    return qtyValue.ToString();
}

这个方法能精准实现你要的显示效果:整数显示为89,89.1变成89.10,89.124变成89.1240,89.19和89.56保持原样。

办法3:若坚持使用BoundColumn(仅适合接受整数带4位小数的场景)

如果你能接受整数显示为89.0000,那确保字段是数值类型后,给BoundColumn加上HtmlEncode="False":

<asp:BoundColumn DataField="MATERIAL_QTY" HeaderText="Quantity" 
                 HeaderStyle-Width="100px" 
                 DataFormatString="{0:0.0000}" 
                 HtmlEncode="False"></asp:BoundColumn>

但这个不符合你给出的示例效果,所以更推荐办法2。


内容的提问来源于stack exchange,提问作者Sachith Wickramaarachchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:07:10