Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Оптимизация кода C#

#c_sharp #инспекция_кода


Имеется код C# Он полностью выполняет свои требования но проблема в том что dataGridView
сильно тормозит

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    if (e.RowIndex < 0 || dataGridView1.Rows[e.RowIndex].IsNewRow) return;
    var now = DateTime.Now;
    var s = Regex.CacheSize;
    now = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
    if (dataGridView1.Rows[e.RowIndex].Cells["Срок до"].Value != null &&
        ((DateTime)dataGridView1.Rows[e.RowIndex].Cells["Срок до"].Value).CompareTo(now) < 0)
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;

    for (var i = 0; i < dataGridView1.Rows.Count; i++)
        for (var j = 0; j < dataGridView1.Columns.Count; j++)
        {
            var formattedValue = dataGridView1.Rows[i].Cells[j].FormattedValue;
            if (formattedValue != null && formattedValue.ToString().ToLower() ==
"удален")
            {
                dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gray;
            }
        }

   for (var i = 0; i < dataGridView1.Rows.Count; i++)
       for (var j = 0; j < dataGridView1.Columns.Count; j++)
       {
           var formattedValue = dataGridView1.Rows[i].Cells[j].FormattedValue;
           if (formattedValue != null && formattedValue.ToString().ToLower() == "неограничен")
           {
               dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Yellow;
           }
       }

}


прошу помощи с оптимизацией так как пока не силён в этом деле 
    


Ответы

Ответ 1



я бы попробовал для начала переписать так: var currentRowIndex = e.RowIndex; for (var j = 0; j < dataGridView1.Columns.Count; j++) { var formattedValue = dataGridView1.Rows[currentRowIndex].Cells[j].FormattedValue; var stringValue = formattedValue.ToString().ToLower().Trim(); switch(stringValue) { case "удален": { dataGridView1.Rows[currentRowIndex].DefaultCellStyle.BackColor = Color.Gray; break; } case "неограничен": { dataGridView1.Rows[currentRowIndex].DefaultCellStyle.BackColor = Color.Yellow; break; } default: { //действие по умолчанию break; } } } можно использовать и условный оператор if но мне больше нравится switch

Ответ 2



Какую технологию вы используете? Если WinForms, то DataGridView сам по себе очень долго отрисовывается. Для обхода этой проблемы нужно создать свой контрол, унаследованный от DataGridView, и задать в нем оптимизацию буфера. public class ucGridControl : DataGridView { public ucGridControl ( ) : base ( ) { SetStyle ( ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); } } Соответственно в форме создавайте уже экземпляр своего класса.

Комментариев нет:

Отправить комментарий