有条件地设置DataGridViewRow的forecolor属性并接收不一致的结果

时间:2014-01-15 10:40:42

标签: c# winforms datagridview

我在使用DataGridView的条件格式时遇到了一些问题,而且我自己似乎无法找到问题。

DataGridView使用从entityframework DbSet检索的数据源填充。它代表了酒店的床位和各种床位的所有客户。我正在尝试使用此业务中可用的不同状态对当前客户列表进行颜色编码。但是,我收到了不一致的结果。代码应将某个字符串值的所有状态设置为红色,另一个状态设置为绿色,如果客户端的事务仍显示欠款,则颜色应为蓝色。

我正在处理DataBindingComplete事件以影响这些更改。如果我没有得到任何结果,问题会更容易解决,但问题是某些交易显示正确的颜色代码,而其他交易没有,即使它们具有相同的状态ID并且完全输入系统同样的方式。

代码如下:

        DataGridView dgv = (DataGridView)sender;

        foreach (DataGridViewRow row in dgv.Rows)
        {

            string statusVal = (string)row.Cells["StatusId"].Value;
            //statusVal = statusVal.Trim();

            int stay = 0;

            if (row.Cells["StayId"].Value != null )
            {
                stay = Convert.ToInt32(row.Cells[6].Value);
            }
            else
            {
                return;
            }

            using (var context = new ArcContext())
            {
                Stay st = context.Stays.Include(s => s.Transaction).Where(s => s.StayId == stay).First();

                if (st.Transaction.AmountDue > st.Transaction.AmountPaid)
                {
                    row.DefaultCellStyle.ForeColor = Color.Blue;
                }
                else
                {
                    if (statusVal == "HC" ) 
                    {
                        row.DefaultCellStyle.ForeColor = Color.Red;

                    }
                    else if (statusVal == "F") 
                    {
                        row.DefaultCellStyle.ForeColor = Color.Green;
                    }
                    else
                    {
                        row.DefaultCellStyle.ForeColor = Color.Black;
                    }
                }
            }

我已经尝试将if语句更改为switch case,但我仍然遇到同样的问题。我还尝试(然后注释掉)修剪字符串,以防从右列检索字符串值时出现问题。

至少可以这么说很奇怪。我已经重新检查了输入代码,并且两个输入完全相同且具有相同HC状态的床(例如)将正确显示为红色,而另一个显示为红色。

非常感谢所有帮助。

编辑:

我也尝试使用与CellFormatting事件相同的代码,但结果不一致。

编辑二:

我还应该补充一点,datagridview是在运行时动态创建的。

2 个答案:

答案 0 :(得分:0)

你应该在CellFormatting中做一些事情而不是DataBindingComplete。

答案 1 :(得分:0)

所以我自己设法找到答案。它实际上非常简单和令人尴尬!

应该有继续;哪里归来;在第一个if块的else部分。返回显然使foreach循环结束,因此在遇到任何空值后格式化停止应用。