单元格值的条件格式

Posted

技术标签:

【中文标题】单元格值的条件格式【英文标题】:Conditional formatting on cell value 【发布时间】:2011-08-08 03:22:55 【问题描述】:

我一直在到处研究 GridViews 的条件格式,但我是 ASP.Net 的新手并且遇到了困难。这是我发现对我最有意义的代码:

protected void GridviewRowDataBound(object sender, GridViewRowEventArgs e)

    if (e.Row.RowType == DataControlRowType.DataRow)
    
        int CellValue = Convert.ToInt32(e.Row.Cells[2].Text);
        if (CellValue >= 0)
        
            e.Row.Cells[2].BackColor = System.Drawing.Color.Green;
        
        if (CellValue < 0)
        
            e.Row.Cells[2].BackColor = System.Drawing.Color.Red;
        
    

GridView 非常简单:一个标题行和三列,标题下有一行,每列有货币金额。我只需要第二行第三列的数据单元格在 >=0 时为绿色,在

我的 int CellValue = 行格式不正确。

【问题讨论】:

这确实看起来不错,发生了什么,它不起作用? e.Row.Cells[2].Text 的值是多少?它是空的吗? Row.Cells[2] 存在吗?它是空的吗?由于那是您遇到问题的那条线,请分解那条线。 使用 Convert.ToInt32() 时,如果值为 null,则返回零。 您能否提供正在引发的异常的消息。 它提供错误 FormatException is unhandled by user code。输入字符串的格式不正确。那里有一个价值。就是同一个gridview的第一列和第二列的区别 【参考方案1】:

尝试将您的int CellValue = 行替换为以下一行

int CellValue = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Difference"));

参考: http://www.johnchapman.name/asp-net-c-change-gridview-cell-background-color-based-on-value/

http://msdn.microsoft.com/en-us/library/4hx47hfe.aspx

【讨论】:

Priyank,如果您还在,您是否对关于导出到 Excel 的原始帖子的第二部分(现在我已经对其进行了编辑)有一个快速的回答?我确定绑定数据冲突,但如果您知道快速修复,我将不胜感激。或者任何人? @Jake,为什么需要在导出功能中重新绑定?这是任何可能有帮助的例子forums.asp.net/t/1255489.aspx @Priyank,就像删除第二个数据绑定一样简单。谢谢你让我明白这一点。感谢您今天的所有帮助。 @Priyank,我撒谎了。这实际上并没有解决它。它似乎曾经工作过,但现在不工作了。 @Priyank,我阅读了您发布的资源,但这似乎是指导出单个网格视图,但我必须将 4 个不同的网格视图导出到一个 Excel 表中。我知道功能按照上面写的那样工作,但是当我处理所有这些条件格式业务时,不知何故产生了冲突【参考方案2】:

我会使用 int.TryParse 而不是 Convert.ToInt32,并验证您的文本实际上是数字。如果看起来正确,则可能的候选是文本包含空格。

由于您的负数是这样格式化的($1,000.00)。检查你的字符串是否存在括号,你可以根据它格式化颜色

if (e.Row.Cells[2].Text.Contains(")")) 
  e.Row.Cells[2].BackColor = System.Drawing.Color.Red;
 else 
  e.Row.Cells[2].BackColor = System.Drawing.Color.Green;

或者更好

e.Row.Cells[2].BackColor = e.Row.Cells[2].Text.Contains(")") ? System.Drawing.Color.Red : System.Drawing.Color.Green;

【讨论】:

识别文本的一种简单方法是在该行设置断点并在 Watch 调试窗口中检查 e.Row.Cells[2].Text 的值。 只有在值不正确的情况下他有一个默认操作要采取的时候才有用。至于您的评论,希望他能完成并回复我们。 代码中断时watch调试窗口的值为0。该值应为 $-92,316 @Jake 其他细胞呢?它们的值是否正确? @Jake 的值为 0、CellValue 还是 e.Row.Cells[2].Text ?当然 CellValue 将有 0 因为那是 int 的默认值,您还需要在该行执行后检查值。你真的很想看看 r.Row.Cells[2].Text 是什么,而不是 CellValue。【参考方案3】:

您的值中有无效字符。把它们去掉,你就可以开始了

int CellValue = Convert.ToInt32(e.Row.Cells[2].Text.Replace("$","").Replace(",","").Replace(".",""));

可能有更好的方法,但现在尝试一下

编辑:更新我上面的更改或使用 double.Parse()

编辑:

int CellValue = (e.Row.Cells[2].Text.IndexOf('(') > -1) ? 0 : -1;

如果你使用布尔值会更好

bool CellValue = e.Row.Cells[2].Text.IndexOf('(') > -1;

【讨论】:

不幸的是,我仍然收到与该行相同的错误。 @Jake 更新了我的答案。它不喜欢那个时期。如果您想保留它,也将其删除或使用 double.Parse() 这很好,但取决于需要对该值执行的其他操作,这可能会过度杀戮。如果需要对该值进行其他操作,那么我会这样做。 我用上面的 bool 替换了原来的 int CellValue 行,但是 if 语句不起作用,因为条件(例如 >= 0)不适用于 bool,所以它说.. . @Jake,你只需要检查 true 或 false 就没有 >= 了。如果有 ( 则为负数,如果没有则不是。0 不是负数。

以上是关于单元格值的条件格式的主要内容,如果未能解决你的问题,请参考以下文章

基于另一个单元格值的条件格式

在PHP中,如何根据单元格值有条件地格式化行

Excel 条件格式 - 多个“开头”语句

Java 设置Excel条件格式

是否可以将电子表格数字格式应用于包含单元格值的单元格?

Excel VBA条件格式未执行