以下代码是我的gridview的rowdatabound事件。它适用于除单元格文本格式之外的所有内容作为货币。实际上是我格式化货币的代码行 导致代码错误。如果我注释掉FormatCurrency行,代码工作正常。为什么这一行a)。不格式化单元格的文本和b)。导致错误?
Protected Sub gvDataRetrieval_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gvDataRetrieval.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim dateindex As Integer = GetColumnIndexByHeaderText(gvDataRetrieval, "date")
e.Row.Cells(dateindex).Text = Split(e.Row.Cells(dateindex).Text, " ")(0)
For i As Integer = 0 To e.Row.Cells.Count - 1
e.Row.Cells(i).Font.Size = 10
e.Row.Cells(i).HorizontalAlign = HorizontalAlign.Center
If i > dateindex Then
If Convert.ToDecimal(e.Row.Cells(i).Text) < 0 Then
e.Row.Cells(i).ForeColor = Drawing.Color.Red
Else
e.Row.Cells(i).ForeColor = Drawing.Color.Black
End If
End If
e.Row.Cells(i).Text = FormatCurrency(e.Row.Cells(i).Text, 0)
Next
End If
End Sub
答案 0 :(得分:4)
尝试使用
e.Row.Cells(i).Text = Convert.ToDecimal(e.Row.Cells(i).Text).ToString("c0")
而不是
e.Row.Cells(i).Text = Format(e.Row.Cells(i).Text, "c0").ToString()
答案 1 :(得分:2)
正如上面其他人所说,如果您尝试将非数字值格式化为货币,您的代码将会出错,而在我看来您并没有这样做。
相反,如果您希望将特定列格式化为货币,请使用该列的DataFormatString属性:
<asp:BoundColumn DataField="YourCurrencyField" DataFormatString="{0:C}" />
显然,您仍需要确保您的字段是可以格式化为货币的有效数字。
答案 2 :(得分:0)
移动
e.Row.Cells(i).Text = Format(e.Row.Cells(i).Text, "c0").ToString()
进入If函数。该行没有检查它是否是日期列。可能试图将日期转换为货币
If i > dateindex Then
If Convert.ToDecimal(e.Row.Cells(i).Text) < 0 Then
e.Row.Cells(i).ForeColor = Drawing.Color.Red
Else
e.Row.Cells(i).ForeColor = Drawing.Color.Black
End If
e.Row.Cells(i).Text = Format(e.Row.Cells(i).Text, "c0").ToString()
End If
答案 3 :(得分:0)
我在C#中遇到了同样的问题,首先将文本转换为double,然后将double格式化为字符串。
我知道这是VB而不是C#,但我想我会在我的Google搜索结果中分享我的解决方案,并可能会帮助某人。
double d;
Double.TryParse(r.Cells[i].Text, out d);
e.Cells[i].Text = String.Format("{0:C0}", d).ToString();