我写了一个方法,在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;
}
答案 0 :(得分:3)
我最好的猜测是你的部分代码真的很慢。
该事件仅针对网格中的每个可见单元格触发。如果您尝试调试事件,焦点将转移到调试器,当您返回到应用程序时,需要重新绘制单元格,导致事件再次触发,从而为印象提供事件不断射击。但是,它没有。
以下是一些提高绩效的建议:
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);
}
}
答案 1 :(得分:1)
你怎么知道它不断射击?你在贬值吗?
只要重新绘制网格,就会运行此代码,这意味着只要表单获得焦点,就会运行。
只是旁注 - 每当我使用该事件时,我必须在代码中放置e.Handled = true;
,以便除了我以外的任何人都不会“绘制”单元格:)
答案 2 :(得分: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);
}
}