如果天平小于零,我试图改变单元格的颜色,然后将其变为红色。我收到了这个错误:
Input string was not in a correct format.
这是我的gridview
<asp:GridView ID="gvTest" runat="server" Width="700px" CssClass="table table-hover table-bordered table-responsive" OnRowDataBound = "OnRowDataBound"
AutoGenerateColumns="false" DataKeyNames="ID"
AllowPaging="true"
OnPageIndexChanging="OnPaging_gvBookKeeping"
PageSize="25">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" HtmlEncode="true" />
<asp:BoundField DataField="FullName" HeaderText="Name" HtmlEncode="true" />
<asp:BoundField DataField="Remaining_Ballance" DataFormatString="{0:C0}" HeaderText="Remaining Ballance" HtmlEncode="true" />
<asp:BoundField DataField="Note" HeaderText="Note" HtmlEncode="true" />
<asp:BoundField DataField="fully_paid" HeaderText="Fully Paid" HtmlEncode="true" />
<asp:TemplateField ItemStyle-Width="30px" HeaderText="Edit Link">
<ItemTemplate>
<asp:LinkButton ID="lnkEdit" CausesValidation="false" runat="server" Text="Edit" OnClick="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<HeaderStyle BackColor="#E5E5E5" />
<PagerSettings Position="TopAndBottom" />
<PagerStyle BackColor="#CCCCCC" ForeColor="#FF3300" HorizontalAlign="Center" />
</asp:GridView>
这里有代码
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TableCell cell = e.Row.Cells[2];
int ballance = int.Parse(cell.Text);
if (ballance < 0)
{
cell.BackColor = Color.Red;
}
}
}
它在这一行失败
int ballance = int.Parse(cell.Text);
余额列的数据类型为十进制(10,2)
答案 0 :(得分:0)
看起来你应该TableCell cell = e.Row.Cells[2];
而不是TableCell cell = e.Row.Cells[3];
列索引从0开始,而不是1。
在您的情况下,这意味着您尝试将Notes
字段的值解析为Int
。
修改强>
您可能还会发现DataFormatString="{0:C0}"
使用货币符号格式化数字(例如$ /£),而且此字符无法转换为整数。
根据建议添加断点将帮助您识别此问题。
答案 1 :(得分:0)
您还可以在int.parse语句周围使用Try {} catch {}块,以便错误转换不会破坏您的代码。
这并不意味着单元格会正确格式化,只是它不会破坏。
或者,使用int.TryParse方法,这通常是更好的解决方案。 TryParse肯定更快。这有点令人困惑,所以这是一个例子
// See if we can parse the 'text' string.
// If we can't, TryParse will return false.
// Note the "out" keyword in TryParse.
string text1 = "x";
int num1;
bool res = int.TryParse(text1, out num1);
if (res == false)
{
// String is not a number.
}
// Use int.TryParse on a valid numeric string.
string text2 = "10000";
int num2;
if (int.TryParse(text2, out num2))
{
// It was assigned.
}
答案 2 :(得分:0)
尝试将代码更改为
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
dynamic dataItem = e.Row.DataItem;
if(dataItem != null && dataItem.Remaining_Ballance < 0)
{
e.Row.Cells[2].BackColor = Color.Red;
}
}
}
注意:我正在为dataItem使用动态数据类型,因为我不知道您的实际对象类型。您应该使用实际的数据类型,还需要进行转换。