1

我写了一个方法,在 devexpress 中绘制 gridview 之前改变行的背景颜色。它工作正常,但我意识到我的代码开始变慢。然后我发现事件连续触发。它永远不会停止。我该如何处理?有没有办法在绘制gridview之后手动停止触发事件,或者我应该尝试用另一个事件或另一种方法解决这个问题???

这是我的活动:

private void gvStep_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
    {
        try
        {
            DataRowView drw = (DataRowView)gvStep.GetRow(e.RowHandle);
            byte actionTypeID = (byte)drw.Row["ActionType"];

            //string colorCode = (new DivaDs()).GetBackColor(actionTypeID);
            string colorCode = divaDs.GetBackColor(actionTypeID);
            Color backColor = ColorTranslator.FromHtml(colorCode);
            e.Appearance.BackColor = backColor;                
        }
        catch (Exception ex)
        {
            XtraMessageBox.Show(ex.Message);   
        }

    }

public string GetBackColor(byte actionTypeID)
    {
        string color = string.Empty;
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[DivaSqlSiteConnString].ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(@"Select BackColor from ActionTypes where ID = @actionTypeID"))
            {
                SqlParameter param = new SqlParameter("@actionTypeID", actionTypeID);

                cmd.Parameters.Add(param);
                cmd.Connection = conn;
                conn.Open();
                color = cmd.ExecuteScalar().ToString();
                conn.Close();
            }
        }
        return color;
    }
4

3 回答 3

3

我最好的猜测是你的代码的某些部分真的很慢。

该事件仅针对网格中的每个可见单元格触发。如果您尝试调试事件,焦点将转移到调试器,当您返回应用程序时,需要重新绘制单元格,导致事件再次触发,从而给人以事件连续触发的印象。然而,事实并非如此。

以下是一些提高性能的建议:

  • DivaDs每次事件触发时, 您都在构建一个新的
    • 相反,请考虑重用类的相同实例作为成员变量
    • 构造函数中发生了什么?
  • 仔细查看该GetBackColor方法,或者ColorTranslator.FromHtml看看是否可以进行任何修改以提高性能。

更新

您似乎正在为网格中的每个单元格查询数据库。这是一个非常糟糕的主意。

一个简单的解决方案是在设置网格的数据源之前预加载所有 ActionType 及其背景颜色(或至少在网格中显示的 ActionType 的子集)。

// member variable
private Dictionary<byte, Color> actionTypeColorDict;

void BuildActionTypeColorDictionary()
{
    string connectionString = ConfigurationManager
      .ConnectionStrings[DivaSqlSiteConnString].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = conn.CreateCommand())
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
    {
       // load all action type IDs and corresponding background color:
       cmd.CommandText = @"SELECT ActionTypeID, BackColor FROM ActionTypes";       
       DataTable actionTypeTable = new DataTable();
       adapter.Fill(actionTypeTable);

       // build a dictionary consisting of action type IDs
       // and their corresponding colors
       actionTypeColorDict = actionTypeTable.AsEnumerable().ToDictionary(
           r => r.Field<byte>("ActionTypeID"),
           r => ColorTranslator.FromHtml(r.Field<string>("ColorCode")));
   }
}

BuildActionTypeColorDictionary在设置网格的数据源之前调用该方法。在RowStyleorCustomDrawCell事件中,使用新的字典成员来确定背景颜色。请参阅以下修改后的RowStyle代码版本:

private void gvStep_RowStyle(object sender,DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
{
    try
    {
        DataRow row = gvStep.GetDataRow(e.RowHandle);
        if (row == null)
            return;

        byte actionTypeID = row.Field<byte>("ActionImage");

        // look up color in the dictionary:
        e.Appearance.BackColor = actionTypeColorDict[actionTypeID];
    }
    catch (Exception ex)
    {
        XtraMessageBox.Show(ex.Message);
    }
}
于 2013-02-04T08:21:25.963 回答
1

你怎么知道它在连续发射?你在调试吗?

每当重绘网格时,此代码就会运行,这意味着只要表单获得焦点。

  1. 此事件针对每个单元运行 - 因此它将运行很多次。
  2. 如果您在此事件中设置断点,您将永远无法摆脱它。它将中断,您将进行调试,完成后它将焦点返回到表单 - 导致使用此事件重绘表单并再次到达断点。

只是一个旁注-每当我使用该事件时,我都必须e.Handled = true;输入代码,这样单元格就不会被除我之外的任何人“绘制”:)

于 2013-02-04T08:33:26.500 回答
0

最后,我找到了。RowStyle 事件仅与 gridview 的行数同时触发

private void gvStep_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
        {
            try
            {
                DataRowView drw = (DataRowView)gridView1.GetRow(e.RowHandle);
                if (drw == null)
                    return;

                byte actionTypeID = (byte)drw.Row["ActionImage"];

                string colorCode = divaDs.GetBackColor(actionTypeID);
                Color backColor = ColorTranslator.FromHtml(colorCode);
                e.Appearance.BackColor = backColor;
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message);
            }
        }
于 2013-02-04T14:23:16.210 回答