У меня есть DatagridView примерно с 300 столбцами и 80 строками. Каждый столбец может быть 3-х разных типов.
Есть 3 флажка, которые отвечают за отображение / скрытие столбцов, каждый флажок для каждого типа столбца.
private void HideColumns(DataGridView datagridview)
{
if (datagridview.DataSource == null) return;
var watch = Stopwatch.StartNew();
// Added this code further the comment
Control c = datagridview;
while (c != this)
{
c.SuspendLayout();
c = c.Parent;
}
this.SuspendLayout();
CurrencyManager currencyManager = null;
try
{
RemoveHandler(datagridview); // remove all the handlers to the datagridivew for performance issue
currencyManager = (CurrencyManager)BindingContext[datagridview.DataSource];
currencyManager.SuspendBinding();
//datagridview.Visible = false;
for (int i = 0; i < datagridview.Columns.Count; i++)
{
var column = datagridview.Columns[i];
var itemType = datagridview.Rows[(int)OrdersAndComponentsRows.ItemType].Cells[column.Index].Value.ToString();
if (itemType == Glossary.IndirectCOType )
column.Visible = IndirectCOCheckBox.Checked;
else if (itemType == Glossary.NotAllocatedType )
column.Visible = NotAllocatedCheckBox.Checked;
else
column.Visible = DirectCOCheckBox.Checked;
}
}
finally
{
//datagridview.Visible = true;
if (currencyManager != null)
currencyManager.ResumeBinding();
AddHandler(datagridview);
// Added this code further the comment
c = datagridview;
while (c != this)
{
c.ResumeLayout();
c = c.Parent;
}
this.ResumeLayout();
}
// 3 check boxes are subscribed to this event
private void DisplayColumn_CheckedChanged(object sender, EventArgs e)
{
try
{
Cursor = Cursors.WaitCursor;
HideColumns(ShipCoverageDGV);
}
finally
{
Cursor = Cursors.Default;
}
}
Проблема в том, что когда я снимаю один из флажков, скрытие столбцов занимает около 50 секунд. Странно то, что при установке флажка скрытые столбцы отображаются примерно за 5 секунд.
Можно ли выполнить какую-либо операцию, чтобы быстрее скрыть столбцы?
@TaW, я обновил свой пост с вашим предложением, но с той же проблемой. Отображение столбца по-прежнему занимает около 50 секунд.





Я думаю, вам нужно выяснить, какая часть кода требует времени. В вашем методе скрытия столбцов происходит много вещей. Можете ли вы записать время на более детальном уровне, например, сколько времени было потрачено на приостановку макета по сравнению с повторением столбцов и скрытием столбцов. Как только вы узнаете проблемную область, вы можете работать над ее оптимизацией. Я предполагаю, что здесь Постановка задачи - это время, потраченное на итерацию, поскольку у нас есть 300 столбцов и проверка типа каждого из них и скрытие в зависимости от их типа.
Установка AutoSizeRowMode на DisplayedHeaders решила проблему. Это занимает около 1 секунды.
Перед установкой значения этому свойству было присвоено значение AllCells.
datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedHeaders;
Примечание. Установка для свойства None уменьшает время примерно до 12 секунд.
Весь метод, включая исправление:
private void HideColumns(DataGridView datagridview)
{
try
{
datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedHeaders;
for (int i = 0; i < datagridview.Columns.Count; i++)
{
var column = datagridview.Columns[i];
var itemType = datagridview.Rows[(int)OrdersAndComponentsRows.ItemType].Cells[column.Index].Value.ToString();
if (itemType == Glossary.IndirectCOType)
column.Visible = IndirectCOCheckBox.Checked;
else if (itemType == Glossary.NotAllocatedType)
column.Visible = NotAllocatedCheckBox.Checked;
else
column.Visible = DirectCOCheckBox.Checked;
}
}
finally
{
datagridview.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
}
}
Ах, это тоже имеет смысл.
SuspendLayout()? И, конечно же, ResumeLayout. Возможно создание DGV с двойной буферизацией ..