我正在尝试格式化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
实现此目的这是清除模糊性的数据源
我的数据来源:
答案 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>