【问题标题】:Format a Numeric Value in Gridview Without Boundfield在没有绑定字段的 Gridview 中格式化数值
【发布时间】:2016-07-29 10:02:41
【问题描述】:

我有一个存储过程,用作我的 Gridview 中的数据源。有些列是数字的,我希望它们采用货币格式,带有小数和逗号。

之前我可以通过在绑定字段中使用 dataformatstring 属性来实现这一点,就像这个示例一样

  <asp:BoundField HeaderText="Non VAT" DataField="nonvat" DataFormatString="{0:#,##0.00;(#,##0.00);0}" />

但是,就我而言,没有可用的 Boundfield,因为我已经制定了不需要 boundfield 的逻辑。

除了在 SQL 中立即格式化之外,还有其他方法吗?

【问题讨论】:

  • 你现在用什么代替BoundField来显示你的数据?模板字段?还有什么?无论如何,发布你现在使用它的方式
  • autogeneratecolumn 设置为 true。所以作为数据源的存储过程实际上是在将数据显示在gridview中当然是在ASP.net中硬编码。
  • 使用boundfield时,autogeneratecolumns设置为false。
  • 好吧,如果您生成列,则不会以任何方式控制输出,因此您无法格式化单个列。您的选择是返回使用绑定字段,或者在将数据源提供给 gridview 之前对其进行预处理。
  • 所以有什么办法吗?如何在 rowdatabound 事件上做呢?

标签: c# sql asp.net sql-server


【解决方案1】:

你总是可以使用RowDataBound,假设nonvat是一个小数并且它是第一列:

protected void grid_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
         DataRowView row = (DataRowView)e.Row.DataItem;
         decimal nonvat = (decimal)row["nonvat"];
         e.Row.Cells[0].Text = nonvat.ToString("#,##0.00;(#,##0.00);0}");
    }
}

【讨论】:

  • 虽然这可能有效,但 OP 故意使用自动生成的列这一事实表明列数是动态的。那么 OP 可能无法知道哪个列索引到哪个列。
  • 如果列名不是静态的怎么办?我可以在“nonvat”部分放什么?
  • @rickyProgrammer:你总是可以使用int-indexer:decimal nonvat = (decimal)row[0];
  • @Andrei:如果 OP 对他的数据一无所知,那么没有任何逻辑可以解决这个问题。所以要么他必须知道索引或列名,类型也相关,因为你不能将任何类型格式化为数字。
  • @Andrei 是的,你是对的。所以也许我现在会求助于我的最后一个选项,即用 SQL 格式化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2013-03-25
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多