我写了一个方法,在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
方法。在RowStyle
或CustomDrawCell
事件中,使用新字典成员来确定背景颜色。请参阅以下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);
}
}
你怎么知道它在持续开火?你在减肥吗?
每当重新绘制网格时,也就是每当表单获得焦点时,都会运行此代码。
- 此事件针对每个单元格运行,因此它将运行多次
- 如果你在这个事件中设置了一个断点,你就永远无法摆脱它。它会中断,你会调试,完成后它会将焦点返回到表单,从而导致使用这个事件重新绘制表单,并再次到达断点
还有一个附带说明-每当我使用该事件时,我都必须将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);
}
}