没有冻结C#的颜色datagridview行

时间:2010-10-08 12:21:51

标签: c# winforms datagridview

我有一个包含5000个条目的datagridview。我想根据一些值为行着色。我是这样做的:

    foreach (DataGridViewRow row in rows)
    {
        var handlingStage = (ESourceHandlingStage)row.Cells["HandlingStage"].Value;
        switch (handlingStage)
        {
            case ESourceHandlingStage.NotStarted:
                row.DefaultCellStyle.BackColor = UnhandledColor;
                row.DefaultCellStyle.SelectionBackColor = Color.Blue;
                break;
            case ESourceHandlingStage.Given:
                row.DefaultCellStyle.BackColor = GivenColor;
                row.DefaultCellStyle.SelectionBackColor = Color.Blue;
                break;
            case ESourceHandlingStage.Taken:
                row.DefaultCellStyle.BackColor = TakenColor;
                row.DefaultCellStyle.SelectionBackColor = Color.Blue;
                break;
            case ESourceHandlingStage.Handled:
                row.DefaultCellStyle.BackColor = HandledColor;
                row.DefaultCellStyle.SelectionBackColor = Color.Blue;
                break;
            case ESourceHandlingStage.Loaded:
                row.DefaultCellStyle.BackColor = LoadedColor;
                row.DefaultCellStyle.SelectionBackColor = Color.Blue;
                break;
            default:
                break;
        }
    }

但是当表单加载时,它会冻结几秒钟。我可以避免吗? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你正在循环所有行,所以这需要一些时间,你拥有的行越多,所需的时间就越多。

您可以将此处理放在后台线程上,但是您需要编组代码,以便在UI线程上进行实际更改。这将花费相同的时间,但在处理时不会锁定UI。

另一种方法是在添加每一行时更改颜色。但是,这取决于您的数据一次添加一行。

答案 1 :(得分:1)

尝试在数据绑定上为行着色。我认为你需要附加到ItemDataBound事件或类似的东西。检查数据并相应地为行着色。这样,您不必在创建它们之后遍历所有行,而是在创建它们时完成工作。