shonezi Ответов: 2

форматирование ячеек замедляет заполнение datagridview?


Здравствуйте, у меня есть проблема и вопрос, dg-это datagridview, который у меня есть, который я заполняю созданным источником привязки

это и есть код

daActivity.SelectCommand = new SqlCommand("SELECT * from DataActivity", cs);
dsActivity.Clear();
daActivity.Fill(dsActivity);

ActivityBS.DataSource = dsActivity.Tables[0];

dg.DataSource = ActivityBS;

и на событии форматирования ячейки у меня есть этот код

for (int i = 0; i < dg.RowCount; i++)
            {
                string status = dg.Rows[i].Cells[12].Value.ToString();
                if (status == "OPEN")
                {
                    dg.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.LightCoral;
                }
                if (status == "INFO")
                {
                    dg.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.LightBlue;
                }
                if (status == "CLOSED")
                {
                    dg.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.LightGreen;
                }
            }

и это событие замедляет заполнение datagridview (dg)...... почему???? есть ли способ преодолеть это, или, может быть, что-то в моем коде или ....ну мне нужна помощь и мнение

__TR__

Попробуйте заменить 3 оператора if в вашем коде оператором switch.

Wes Aday

Трудно сказать без дополнительного контекста, но я согласен с OriginalGriff. Мне кажется, что вы все время переформатируете клетки.

shonezi

да, вы правы, все вы, я все время переформатируюсь, как остановить это и сделать это только один раз

shonezi

как это сделать??

__TR__

Ссылаться:
http://msdn.microsoft.com/en-us/library/06tc147t(v=против 100).aspx

shonezi

Я немного запутался в этом вопросе

__TR__

Его, как это:

string status = dg.Rows[i].Ячейки[12].Значение.Метод toString();
переключатель (состояние)
{
дело "открыто":
ДГ.Строки[я].DefaultCellStyle.BackColor = Система.Рисование.Цвет.LightCoral;
перерыв;
кейс "информация":
ДГ.Строки[я].DefaultCellStyle.BackColor = Система.Рисование.Цвет.Светло-голубой;
перерыв;
дело "закрыто":
ДГ.Строки[я].DefaultCellStyle.BackColor = Система.Рисование.Цвет.Светло-зеленый;
перерыв;
по умолчанию:

перерыв;
}

2 Ответов

Рейтинг:
17

OriginalGriff

Трудно быть уверенным, не запустив его, но первое, что вы должны заметить,-это то, что CellFormating вызывается на основе каждой ячейки: поскольку вы перебираете все строки каждый раз, когда он вызывается, вы можете обнаружить, что это является источником замедления.

Однако первое, что нужно сделать, это получить некоторые цифры - пока у вас нет хорошего представления о том, сколько времени тратится где, вы не можете быть уверены, что делаете какие-либо реальные улучшения.

Посмотрите на Класс секундомера[^] - он предоставляет вам точный метод синхронизации от точки к точке. Начните с таймера вокруг настройки источника данных, а затем добавьте его в событие CellFormatting. Посмотрите, какие цифры вы получите, и вы можете начать работать там, где все идет медленно.


shonezi

Я сделал то, что вы предложили, я получаю около 300 миллисекунд ответа при запуске, но когда он заканчивает заполнение, он показывает 6. проблема также в том, что когда я прокручиваю вверх и вниз datagridview, он также медленный

OriginalGriff

Попробуйте распечатать секундомер событий на консоли - это повлияет на тайминги, но даст вам представление о том, как часто и как долго происходит каждое отдельное событие.

Что касается прокрутки, то меня это нисколько не удивляет - помните, что событие CellFormating будет вызываться для каждой ячейки *по мере ее отображения* - так что любой цикл, проходящий через каждую строку, будет выполняться много раз при прокрутке!

shonezi

ну, вы совершенно правы, поэтому я сделал это, я поместил весь код с секундомером на показанное событие, чтобы поднять его только один раз при загрузке формы и его 0 миллисекунд, работает быстро. может быть, это нормально, не так ли?

OriginalGriff

Если данные не меняются, то да, вероятно, все в порядке - вы знаете свою систему лучше, чем я! :смеяться:

shonezi

спасибо вам, и спасибо вам ТР и Уэс Дэй :))

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

Member 11252556

In my case the problem was caused by DataGridView property AutoSizeColumnsMode=AllCells. Probably after cell formatting all other cells in column and header cell had to be redrawn to fit theirs dimensions to the new cell dimensions. After I was changed property value to it default value "None", grid is painted immediatel