c#4.0-事件连续触发



我写了一个方法,在devexpress中绘制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;
    }

我的最佳猜测是,您的代码的某些部分确实很慢。

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

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

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

更新

您似乎正在查询网格中每个单元格的数据库。这真是个坏主意。

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

// 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方法。在RowStyleCustomDrawCell事件中,使用新字典成员来确定背景颜色。请参阅以下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);
    }
}

你怎么知道它在持续开火?你在减肥吗?

每当重新绘制网格时,也就是每当表单获得焦点时,都会运行此代码。

  1. 此事件针对每个单元格运行,因此它将运行多次
  2. 如果你在这个事件中设置了一个断点,你就永远无法摆脱它。它会中断,你会调试,完成后它会将焦点返回到表单,从而导致使用这个事件重新绘制表单,并再次到达断点

还有一个附带说明-每当我使用该事件时,我都必须将e.Handled = true;放入代码中,这样除了我之外,任何人都不会"绘制"单元格:)

终于找到了。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);
            }
        }

最新更新