如何格式化gridview列以显示代码后面的2个小数位?

时间:2015-12-16 11:40:34

标签: c# asp.net gridview datagridview

我正在尝试格式化Gridview列,以在小数点后最多显示2位数的十进制值。 我知道boundfield的DataFormatString='{0:0.00}和ItemTemplate的Eval("NumFailedFiles", "{0:0.00}")

但我希望这是可配置的,即我想得到否。数据库中的小数位数并应用于boundfield或itemtemplate。 为了实现这一点,我尝试在gridview_RowDataBound事件中进行格式化但是徒劳无功。

 GridDecimal = Convert.ToInt32(resXResourceSet.GetString("GridMaxDecimals"));
        var field = gridView.Columns[1] as BoundField;
        field.DataFormatString = "{0:0.00}";

使用此代码我遇到了一个说

的异常
  

"对象引用未设置为对象的实例"

在上面代码的第3行。

有人可以帮我解决如何为boundfield和Itemtemplate

实现此目的

这是清除模糊性的数据源

我的数据来源:

2 个答案:

答案 0 :(得分:3)

您可以使用在网格数据绑定后触发一次的DataBound事件。例如(取决于网格的实际数据源):

protected void GridView_DataBound(Object sender, EventArgs e)
{
    GridView grid = (GridView)sender;
    BoundField col = (BoundField)grid.Columns[1];
    int numDecimals = 2; // from database
    col.DataFormatString = "{0:N" + numDecimals + "}";
}

如果您使用TemplateField RowDataBound,则应使用如下所示的延迟加载属性,以避免必须为每一行加载值:

private int? _NumDecimals;
private int NumDecimals 
{
    get 
    {
        if (!_NumDecimals.HasValue)
            _NumDecimals = GetNumDecimalsFromDB();
        return _NumDecimals.Value;
    }
    set 
    {
        _NumDecimals = value;
    }
}

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // if following doesnt work use the debugger to see the type of e.Row.DataItem
        DataRow row = ((DataRowView)e.Row.DataItem).Row;
        int numFailedFiles = row.Field<int>("NumFailedFiles");
        //presuming that your TemplateField contains a Label with ID="LblNumFailedFiles"
        Label LblNumFailedFiles = (Label)e.Row.FindControl("LblNumFailedFiles");
        string formatString = String.Format("N{0}", NumDecimals);
        LblNumFailedFiles.Text = numFailedFiles.ToString(formatString);
    }
}

答案 1 :(得分:0)

GridView的OnRowDataBound,您必须确定要自定义的行类型,如标题行,数据行等。并且每行都会引发RowDataBound事件,因此您需要访问具有特定列而不是gridview的特定行。

解决方案1:如果Boundfield与数据绑定

  protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Fetching BoundField Value.
      double dbvalue =Convert.ToDouble(e.Row.Cells[ColumnNumber].Text);
      e.Row.Cells[ColumnNumber].Text = String.Format("{0:0.00}",dbvalue  );
      Label lblnum = (Label)e.Row.Cells[ColumnNumber].FindControl("labelID");
      lblnum.Text =  String.Format("{0:0.00}", integervaluetoformat);
    }
  }

解决方案2 :(如果列是项目字段模板)

如果是ItemTemplate Field,则无需触发RowDataBound:

<asp:TemplateField>
    <ItemTemplate>
       <asp:Label ID="lblnum" runat="server" Text='<%# String.IsNullOrEmpty(Eval("dbcolumn").ToString()) ?  "" :  string.Format("{0:0.00}",Convert.ToDouble(Eval("dbcolumn").ToString())) %>'></asp:Label>
    </ItemTemplate>
 </asp:TemplateField>