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グリッドのデータ ソースを設定する前にメソッドを呼び出します。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);
    }
}
于 2013-02-04T08:21:25.963 に答える
1

連続して発砲していることをどのように知っていますか?デバッグしていますか?

このコードは、グリッドが再描画されるたびに実行されます。つまり、フォームがフォーカスされるたびに実行されます。

  1. このイベントはセルごとに実行されるため、かなりの回数実行されます。
  2. このイベントにブレークポイントを設定すると、そこから抜け出せなくなります。ブレークし、デバッグします。完了すると、フォームにフォーカスが戻ります。このイベントを使用してフォームが再描画され、ブレークポイントに再び到達します。

そして、ちょっとしたメモ-そのイベントを使用するときはいつe.Handled = true;でも、私以外の誰かがセルを「描画」しないようにコードを挿入する必要があります:)

于 2013-02-04T08:33:26.500 に答える
0

最後に、私はそれを見つけました。RowStyle イベントは、グリッドビューの行数と同時にのみ発生します

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 に答える